home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-04-22 | 88.3 KB | 1,914 lines |
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 1
- ALBUG.M65
-
- 1 ;<HESS.ATARI>ALBUG.M65.71 12-Mar-82 15:25:26, Edit by HESS
- 2
- 3 .TITLE LBUG - 6502 DEBUGGER (ATARI VERSION)
- 4 ; (C) Ted Hess, Hudson, Ma. 1977,1978,1979,1980,1981,1982
- 5
- 6 .LIST MB ;LIST BINARY IN MACROS
- 7 .NLIST TOC ;NO TABLE OF CONTENTS
- 8 .ENABL LC ;ALLOW LOWER CASE TEXT
- 9
- 10 ; INVOKE SYSTEM MACROS FOR PARAMETER DEFINITIONS
- 11
- 12 .MCALL ATARI
- 13 .MCALL M6502
- 14 0000 ATARI
- 15 0000 M6502
- 16
- 17 ;***** THINGS TO DO ******
- 18 ;
- 19 ; 1) Re-write parser for DDT syntax and better defaults
- 20 ; Make better use of ATARI keyboard!
- 21 ;
- 22 ;*************************
- 23
- 24 ;LBUG STORAGE ASSIGNMENTS (PAGE 0)
- 25
- 26 00E0 INBUF =$E0 ;INPUT BUFFER (2 BYTES)
- 27 00E2 POINT =$E2 ;OPEN CELL ADDRS (2 BYTES)
- 28 00E4 AC =$E4 ;ACCUMULATOR
- 29 00E5 XREG =$E5 ;X INDEX
- 30 00E6 YREG =$E6 ;Y INDEX
- 31 00E7 PS =$E7 ;PROCESSOR STATUS REG
- 32 00E8 SP =$E8 ;STACK POINTER
- 33
- 34 ;RANDOM CONSTANTS AND PARAMETERS
- 35
- 36 0031 DSKCOD =$31 ;DISK DEVICE CODE
- 37 0052 DSKR ='R ;DISK READ COMMAND
- 38 0057 DSKW ='W ;DISK WRITE COMMAND
- 39 0008 MAXBP =8 ;EIGHT IS TRADITIONAL (BREAK POINTS)
- 40 0018 LNSCR =24 ;# OF LINES ON SCREEN
- 41 0037 LPP =55 ;LINES/PAGE ON PRINTER
- 42
- 43 .IIF NDF,LORG, LORG= $8000 ;DEFAULT PROG ORIGIN
- 44
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 2
- ALBUG.M65
-
- 46 ;MAIN ENTRY POINT - NORMAL START (LORG)
- 47 ;RESET ENTRY - REMOVE BREAKPOINTS (LORG+3)
- 48
- 49 0000 SETPC PPC,LORG
- 50
- 51 ;NORMAL START ENTRY
- 52
- 53 8000 4C 73 80 START: JMP STRT1
- 54 8003 4C 70 80 JMP RST
- 55
- 56 8006 7D 4C 61 VERS: .ASCII <.ATCLR>"Lady Bug - V4.0, (C) Ted Hess 1981"<.ATEOL>
- 8009 64 79 20
- 800C 42 75 67
- 800F 20 2D 20
- 8012 56 34 2E
- 8015 30 2C 20
- 8018 28 43 29
- 801B 20 54 65
- 801E 64 20 48
- 8021 65 73 73
- 8024 20 31 39
- 8027 38 31 9B
- 57 802A 0001 ROF: .BLKB 1 ; REGISTER OPENED FLAG
- 58 ; 0 = CLOSED
- 59 ; $1 = HEX/OCTAL
- 60 ; $FF = SYMBOLIC
- 61 802B 0001 CF: .BLKB 1 ;ADDRESS FLAG
- 62 ; $FF = NO ADDRESSES TYPED
- 63 ; $00 = ONE ADDRESS TYPED
- 64 ; $01 = COMMA TYPED
- 65 802C 0002 PRPC: .BLKB 2 ;PROGRAM COUNTER (AT BREAK)
- 66 802E 0001 LENGTH: .BLKB 1 ; LENGTH OF INSTR (0 := 1-BYTE)
- 67 802F 0001 PFRMT: .BLKB 1 ; PRINT FORMAT INDEX
- 68 8030 0002 VEB: .BLKB 2 ;4 BYTE PROGRAM BLOCK
- 69 8032 0001 LMNEM: .BLKB 1 ;(VEB+2) TEMP FOR MNEMONIC PRINT
- 70 8033 0001 RMNEM: .BLKB 1 ;(VEB+3) ...
- 71 8034 0002 STARTA: .BLKB 2 ;STARTING ADDRESS
- 72 8036 0002 ENDAD: .BLKB 2 ;ENDING ADDRESS
- 73 8038 0001 TEMPX: .BLKB 1 ;NEED TO SAVE X AROUND OS
- 74 8039 0001 TEMPY: .BLKB 1 ;TEMP SAVE Y
- 75 803A 0001 SNGLF: .BLKB 1 ;SINGLE STEP FLAG
- 76 803B 0001 BPN: .BLKB 1 ;BREAKPOINT NUMBER OR 0
- 77 803C 0001 DRVNO: .BLKB 1 ;DISK UNIT #
- 78 803D 0001 PIOCB: .BLKB 1 ;IOCB INDEX FOR PRINTER/EDITOR
- 79 803E 0001 PNTF: .BLKB 1 ; PRINTER FLAG
- 80
- 81 803F 0001 TABPT: .BLKB 1 ;INDEX INTO TAB RING
- 82 8040 0008 TABRNG: .BLKW 8 ;RING BUFFER FOR TAB/UNTAB
- 83
- 84 ;BREAKPOINT TABLES
- 85
- 86 8050 0008 BPINS: .BLKB MAXBP ;SAVE INSTR
- 87 8058 0008 BPCNT: .BLKB MAXBP ;PROCEED COUNT
- 88 8060 0008 BPLOCL: .BLKB MAXBP ;LOCATION LOW
- 89 8068 0008 BPLOCH: .BLKB MAXBP ;LOCATION HIGH
- 90
- 91 ;RESET ENTRY
- 92
- 93 8070 20 3F 88 RST: CALL REMB ;REMOVE BREAK POINTS
- 94
- 95 ; NORMAL STARTUP JOINS HERE
- 96
- 97 8073 20 A8 87 STRT1: CALL INITS ;INITIALIZE THINGS
- 98 8076 TYPE VERS ;OUTPUT HERALD
- (1) 8076 A2 06
- (1) 8078 A0 80
- (1) 807A 20 85 F3
- 99 807D CLR <SNGLF,BPN,DRVNO,PS> ;CLEAR SS FLAG, ETC.
- (1) 807D A9 00
- (2) 807F 8D 3A 80
- (2) 8082 8D 3B 80
- (2) 8085 8D 3C 80
- (2) 8088 85 E7
- 100 808A SET2 BREAK,VBREAK ;BREAK POINT ENTRY
- (1) 808A A9 73
- (1) 808C 8D 06 02
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 2-1
- ALBUG.M65
-
- (1) 808F A9 88
- (1) 8091 8D 07 02
- 101 8094 BA TSX ;SAVE CURRENT STACK POINTER
- 102 8095 86 E8 STX SP
- 103 8097 4C BC 82 JMP RALL ;CLEAR ALL BREAK POINTS
- 104
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 3
- ALBUG.M65
-
- 106 ;MAIN DECODER
- 107
- 108 809A 20 DF 80 ERR: CALL ERRFST ;PRINT <BELL>?
- 109
- 110 809D 20 2E 88 DCD: CALL CLOSEP ;CLOSE PRINTER IF OPEN
- 111 80A0 20 85 87 CALL CRLFS ;PRINT CRLF
- 112 80A3 DCD4: CLR ROF ;CLOSE OPEN REG
- (1) 80A3 A9 00
- (2) 80A5 8D 2A 80
- 113 80A8 A6 E8 LDX SP ;RESTORE STACK POINTER
- 114 80AA 9A TXS
- 115
- 116 80AB A9 FF SCAN: LDA #$FF ;SET UP ADDRESS FLAG
- 117 80AD 8D 2B 80 STA CF
- 118 80B0 20 7C 86 CALL GETNUM ;INPUT SOMETHING
- 119 80B3 AE 2B 80 LDX CF ;GET QUANITY TYPED FLAG
- 120 80B6 30 0A BMI CLGL ;DO NOT DESTROY OLD VALUE FOR ' AND =
- 121
- 122 80B8 SCAN1: MOV2X INBUF,STARTA ;SET UP STARTING ADDRESS
- (1) 80B8 A6 E0
- (1) 80BA 8E 34 80
- (1) 80BD A6 E1
- (1) 80BF 8E 35 80
- 123 ;FALL INTO SPECAIL CHARACTER DECODER
- 124
- 125
- 126 ;HERE TO CHECK LEGAL CHARACTER
- 127
- 128 80C2 A2 0C CLGL: LDX #MAXL ;INIT INDEX
- 129 80C4 DD EE 8A LGL1: CMP LGCH,X ;MATCH?
- 130 80C7 F0 05 BEQ LGL2 ;YES - PROCEED
- 131 80C9 CA DEX ;NO - STEP TO NEXT
- 132 80CA 10 F8 BPL LGL1 ;BRANCH IF MORE TO GO
- 133 80CC 30 CC BMI ERR ;ERROR IF NONE
- 134
- 135 ;FOUND MATCH - DISPATCH
- 136
- 137 80CE 8A LGL2: TXA ;GET INDEX
- 138 80CF 0A LGL3: ASL A ; TIMES 2
- 139 80D0 AA TAX ; BACK TO X
- 140 80D1 BD 06 8B LDA LDISP+1,X ;GET HIGH BYTE OF XFER
- 141 80D4 48 PHA ;PUT ON STACK
- 142 80D5 BD 05 8B LDA LDISP,X ;GET XFER LOW
- 143 80D8 48 PHA ;STACK NOW HAS XFER ADDRS
- 144 80D9 AD 2B 80 LDA CF ;GET ARGUMENT FLAG IN AC
- 145 80DC C9 01 CMP #1 ;SET FLAGS BASED ON ONE
- 146 80DE 60 RET ;DISPATCH
- 147
- 148 80DF A9 FD ERRFST: LDA #.ATBEL ;RING BELL
- 149 80E1 20 6D 87 CALL OUTSCH
- 150 80E4 A9 3F LDA #'? ;THEN PRINT ?
- 151 80E6 4C 6D 87 JMP OUTSCH
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 4
- ALBUG.M65
-
- 153 ;COMMA - SAVE INPUT AS STARTING ADDRESS
- 154
- 155 80E9 AD 2B 80 COMMA: LDA CF ;GET ARGUMENT FLAG IN AC
- 156 80EC D0 AC BNE ERR ;MUST BE ONE AND ONLY ONE ARGUMENT TYPED SO FAR
- 157 80EE 20 7C 86 CALL GETNUM ;GET ANOTHER ARGUMENT
- 158 80F1 COMMA1: MOV2X INBUF,ENDAD ;SET UP ENDING ADDRESS
- (1) 80F1 A6 E0
- (1) 80F3 8E 36 80
- (1) 80F6 A6 E1
- (1) 80F8 8E 37 80
- 159 80FB AE 2B 80 LDX CF ;GET ARGUMENT FLAG
- 160 80FE E0 02 CPX #2 ;CHECK TO SEE IF IT IS OPEN
- 161 8100 10 98 BPL ERR ;NO THEN IT IS AN ERROR
- 162 8102 30 BE BMI CLGL ;GO DISPATCH ON BREAK CHARACTER
- 163
- 164
- 165 ;ESC SEEN (ECHO $)
- 166
- 167 8104 A9 24 ESC: LDA #'$
- 168 8106 20 6D 87 CALL OUTSCH
- 169 8109 20 F0 86 CALL GETSCH ;GET NEXT CHARACTER
- 170 810C 38 SEC ;CLEAR BORROW
- 171 810D E9 31 SBC #'1 ;CHECK FOR NUMBER
- 172 810F 30 89 BMI ERR ;IF LESS THAN THEN IT IS AN ERROR
- 173 8111 C9 08 CMP #MAXBP ;IS IT LESS THAN MAXIMUM ALLOWABLE BREAKPOINT
- 174 8113 30 24 BMI ESCB ;YES GO GET BREAKPOINT B
- 175 8115 E9 10 SBC #@20 ;CHECK FOR A
- 176 8117 30 81 BMI ERR ;IF LESS THAN A IT IS AN ERROR
- 177 8119 29 DF AND #@337 ;GET RID OF LOWERCASE BIT
- 178 811B C9 1A CMP #'Z-@100 ;IS IT GREATER THAN Z
- 179 811D 10 49 BPL ERR1 ;YES. REPORT ERROR
- 180 811F AA TAX ;PUT IT IN THE X REGISTER
- 181 8120 BD 53 8B LDA ARGNUM,X ;GET NUMBER OF ARGUMENTS
- 182 8123 CD 2B 80 CMP CF ;IS IT CORRECT
- 183 8126 F0 0B BEQ 10$ ;YES. SKIP REST OF TEST
- 184 8128 C9 80 CMP #$80 ;IS IT ONE OR NONE FLAG
- 185 812A D0 3C BNE ERR1 ;NO GIVE ERROR
- 186 812C AD 2B 80 LDA CF ;GET FLAG
- 187 812F C9 01 CMP #1 ;LESS THAN ONE
- 188 8131 10 35 BPL ERR1 ;NO. GO GIVE ERROR
- 189 8133 8A 10$: TXA ;GET INDEX BACK TO A
- 190 8134 18 CLC
- 191 8135 69 0D ADC #<DISP-LDISP>/2 ;CALC TABLE OFFSET
- 192 8137 D0 96 BNE LGL3 ;DISPATCH
- 193
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 5
- ALBUG.M65
-
- 195 8139 AA ESCB: TAX ;SAVE BP NUMBER IN X
- 196 813A 20 F0 86 CALL GETSCH ;GET THE CHARACTER
- 197 813D 29 DF AND #@337 ;GET RID OF CASE BIT
- 198 813F C9 42 CMP #'B ;IS IT A B
- 199 8141 D0 25 BNE ERR1 ;NO. THEN IT IS AN ERROR
- 200 8143 4C 6D 82 JMP BKPT1 ;YES. GO DO BREAKPOINT
- 201
- 202
- 203 ;DOT (.) SEEN - SUBSTITUE CURRENT LOC
- 204
- 205 8146 DOT: MOV2 POINT,INBUF ;PUT LOC INTO BUFFER
- (1) 8146 A5 E2
- (1) 8148 85 E0
- (1) 814A A5 E3
- (1) 814C 85 E1
- 206 814E 20 F0 86 DOT1: CALL GETSCH ;GET ANOTHER CHARACTER
- 207 8151 EE 2B 80 INC CF ;SAY QUANT TYPED
- 208 8154 D0 9B BNE COMMA1 ;GO SET UP ENDING ADDRESS
- 209 8156 4C B8 80 JMP SCAN1 ;BACK TO SCAN LOOP
- 210
- 211
- 212 ;PERCENT SEEN - SPECIAL REGISTER
- 213
- 214 8159 20 F0 86 PERC: CALL GETSCH ;LOOK AT NEXT CHAR
- 215 815C 29 DF AND #@337 ;GET RID OF CASE BIT
- 216 815E A2 04 LDX #MAXS ; AND CHECK FOR SPECIAL
- 217 8160 DD FB 8A PERC1: CMP LGPC,X ;MATCH?
- 218 8163 F0 06 BEQ PERC2 ;???
- 219 8165 CA DEX ;NO - STEP TO NEXT
- 220 8166 10 F8 BPL PERC1
- 221 8168 4C 9A 80 ERR1: JMP ERR ;ERROR IF NO MORE
- 222
- 223
- 224 ;SETUP DESIRED REGISTER ADDRS AS INPUT TYPED
- 225
- 226 816B BD 00 8B PERC2: LDA PERAD,X ;GET ADDRS OF BYTE
- 227 816E 85 E0 STA INBUF ;STORE AS INPUT
- 228 8170 CLR INBUF+1
- (1) 8170 A9 00
- (2) 8172 85 E1
- 229 8174 F0 D8 BEQ DOT1 ;BACK TO INPUT LOOP
- 230
- 231
- 232 ;CARRIAGE RETURN TYPED
- 233
- 234 8176 20 27 86 CRET: CALL CLSE ;CLOSE OPEN REG IF ANY
- 235 8179 4C 9D 80 JMP DCD ;RE-INIT THINGS
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 6
- ALBUG.M65
-
- 237 ;SLASH TYPED - OPEN A REG IN SYMBOLIC
- 238
- 239 817C 10 EA SLSH: BPL ERR1 ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR
- 240 817E A9 FF LDA #$FF ;SET ROF FLAG
- 241 8180 D0 04 BNE SLSH1 ;JOIN COMMON CODE
- 242
- 243 ;SLASH TYPED - OPEN A REG (HEX)
- 244
- 245 8182 10 E4 BRAKET: BPL ERR1 ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR
- 246 8184 A9 01 LDA #1 ;SET REG OPEN
- 247 8186 8D 2A 80 SLSH1: STA ROF
- 248 8189 20 6B 87 CALL OUTSSP ;TYPE A SPACE
- 249 818C AD 2B 80 LDA CF ;ANYTHING TYPED
- 250 818F D0 03 BNE 10$ ; ??
- 251 8191 20 41 86 CALL INTPT ;YES - OPEN IT
- 252 8194 20 2F 87 10$: CALL PRTSCN ;GO DO OUTPUT
- 253 8197 4C AB 80 JMP SCAN
- 254
- 255
- 256 ;LINE FEED - OPEN NEXT REG
- 257
- 258 819A 10 CC LFD: BPL ERR1 ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR
- 259 819C 20 85 87 CALL CRLFS ;OUTPUT <EOL>
- 260 819F AD 2A 80 LFD0: LDA ROF ;CHECK TYPE
- 261 81A2 30 11 BMI LFDS ;DO SYMBOLIC NEXT INSTR
- 262 81A4 20 27 86 CALL CLSE ;CLOSE OPEN REG IF ANY
- 263 81A7 20 D0 87 CALL INCPT ;STEP TO NEXT LOC
- 264 81AA EE 2A 80 LFDC: INC ROF ;MARK OPEN HEX
- 265 81AD A2 5B LDX #'[ ;SLASH
- 266 81AF 20 25 87 CALL PRTSLC ;GO PRINT THE CONTENTS
- 267 81B2 4C AB 80 JMP SCAN
- 268
- 269 81B5 20 00 8A LFDS: CALL PCADJ ;STEP OVER INSTR
- 270 81B8 85 E2 STA POINT ;SAVE NEW PC
- 271 81BA 84 E3 STY POINT+1
- 272 81BC 20 1E 87 LFDS1: CALL PRTSLS ;GO PRINT LOCATION IN SYMBOLIC
- 273 81BF 4C AB 80 JMP SCAN ;BACK TO MAIN COMMAND DECODER
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 7
- ALBUG.M65
-
- 275 ;^ OR <BS> TYPED - OPEN PREVIOUS
- 276
- 277 81C2 10 A4 BACK: BPL ERR1 ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR
- 278 81C4 20 27 86 CALL CLSE ;CLOSE OPEN REG
- 279 81C7 20 4C 86 CALL DECPT ;DECREMENT THE POINTER
- 280 81CA 20 85 87 CALL CRLFS ;PUT OUT A CARRIAGE RETURN LINE FEED
- 281 81CD 4C AA 81 JMP LFDC ;COMMON CODE
- 282
- 283 ;TAB GO TO ADDRESS IF IN SYMBOLIC MODE
- 284
- 285 81D0 10 96 TAB: BPL ERR1 ;ERROR IF MORE THAN 1 ARG
- 286 81D2 AD 2A 80 LDA ROF ;GET OUTPUT MODE FLAG
- 287 81D5 10 91 BPL ERR1 ;ONLY GET EFFECTIVE ADDRESS IF SYMBOLIC
- 288 81D7 AE 3F 80 LDX TABPT ;SAVE POINT
- 289 81DA A5 E2 LDA POINT
- 290 81DC 9D 40 80 STA TABRNG,X ;IN RING BUFFER
- 291 81DF A5 E3 LDA POINT+1
- 292 81E1 9D 48 80 STA TABRNG+8,X
- 293 81E4 E8 INX ;STEP INDEX
- 294 81E5 8A TXA
- 295 81E6 29 07 AND #$07 ;MASK TO MOD 8 CNTR
- 296 81E8 8D 3F 80 STA TABPT ;STORE IT BACK
- 297 81EB 20 7E 89 CALL CALCAD ;CALCULATE EFFECTIVE ADDRESS
- 298 81EE MOV2 INBUF,POINT ;GET JMP ADDRESS
- (1) 81EE A5 E0
- (1) 81F0 85 E2
- (1) 81F2 A5 E1
- (1) 81F4 85 E3
- 299 81F6 20 85 87 TAB1: CALL CRLFS ;PUT OUT CARRIAGE RETURN LINE FEED
- 300 81F9 4C BC 81 JMP LFDS1 ;GO TYPE OUT NEW ADDRESS
- 301
- 302 ; UNTABIFY - POP RING THEN TAB
- 303
- 304 81FC 10 03 UNTAB: BPL 5$ ;ERROR IF ANYTHING TYPED
- 305 81FE AD 2A 80 LDA ROF ;REGISTER OPEN FLAG
- 306 8201 10 7D 5$: BPL ERR2 ;ERROR IF NOT SYMBOLIC MODE
- 307 8203 A9 07 LDA #$7 ;MASK FOR MOD 8 SUBTRACT
- 308 8205 CE 3F 80 DEC TABPT ;DECREMENT INDEX
- 309 8208 2D 3F 80 AND TABPT ;MASK IT
- 310 820B 8D 3F 80 STA TABPT ;STORE RESULT
- 311 820E AA TAX ;XFER TO INDEX
- 312 820F BD 40 80 LDA TABRNG,X ;FETCH SAVED VALUE
- 313 8212 85 E2 STA POINT ;RESTORE TO POINT
- 314 8214 BD 48 80 LDA TABRNG+8,X
- 315 8217 85 E3 STA POINT+1
- 316 8219 4C F6 81 JMP TAB1 ;FINISH THRU COMMON CODE
- 317
- 318 ;EQUAL SIGN - TYPE IN OCTAL
- 319
- 320 821C 10 62 TOC: BPL ERR2 ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR
- 321 821E AD 34 80 LDA STARTA ;GET CHARACTER IN A
- 322 8221 8D 2F 80 STA PFRMT ;SAVE BYTE
- 323 8224 A2 03 LDX #3 ;TYPE 3 DIGITS
- 324 8226 A0 03 LDY #3 ; OF 3 BITS EACH
- 325 8228 18 CLC ;INIT CARRY BIT
- 326 8229 90 03 BCC 15$ ;SKIP FIRST SHIFT
- 327 822B 0E 2F 80 10$: ASL PFRMT ;SHIFT LEFT
- 328 822E 2A 15$: ROL A ;GET BIT INTO AC
- 329 822F 88 DEY ;COUNT BITS
- 330 8230 D0 F9 BNE 10$ ;CONTINUE FOR 3 BITS
- 331 8232 29 07 AND #@7 ;GRNTEE OIT
- 332 8234 20 A3 87 CALL HEXST1 ;TYPE OUT
- 333 8237 A0 03 LDY #3 ;RELOAD BIT COUNTER
- 334 8239 CA DEX ;DECREMENT DIGIT COUNTER
- 335 823A D0 EF BNE 10$ ;LOOP TILL DONE
- 336 823C 20 6B 87 TOCRET: CALL OUTSSP ;PRINT SPACE
- 337 823F 4C AB 80 JMP SCAN ;BACK TO MAIN LOOP
- 338
- 339
- 340 ;QUOTE - TYPE OUT ASCII
- 341
- 342 8242 10 3C QUOTE: BPL ERR2 ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR
- 343 8244 AD 34 80 LDA STARTA ;GET CHARACTER IN A
- 344 8247 20 6D 87 CALL OUTSCH ;PRINT THE CHARACTER IN ASCII
- 345 824A 4C 3C 82 JMP TOCRET ;GO PRINT A SPACE AND RETURN
- 346
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 8
- ALBUG.M65
-
- 348 ;$A - TYPE MEMORY OUT IN ASCII
- 349
- 350 824D 20 41 86 ASCII: CALL INTPT ;SET UP POINT FROM ADDRESS TYPED
- 351 8250 20 F0 86 CALL GETSCH ;GET QUOTE CHARACTER
- 352 8253 8D 2B 80 STA CF ;SAVE IT FOR COMPARE
- 353 8256 20 F0 86 10$: CALL GETSCH ;GET ANOTHER CHARACTER
- 354 8259 CD 2B 80 CMP CF
- 355 825C F0 0A BEQ 20$ ;IF QUOTE RETURN
- 356 825E A0 00 LDY #0 ;SET UP FOR INDEXING
- 357 8260 91 E2 STA (POINT),Y ;PUT THE CHARACTER IN MEMORY
- 358 8262 20 D0 87 CALL INCPT ;INCREMENT THE POINTER
- 359 8265 4C 56 82 JMP 10$ ;GO DO ANOTHER CHARACTER
- 360
- 361 8268 4C 9D 80 20$: JMP DCD ;GO BACK TO MAIN SCANING LOOP
- 362
- 363
- 364 ;$B - BREAKPOINT COMMAND
- 365
- 366 826B A2 FF BKPT: LDX #$FF ;SAY NO BREAKPOINT NUMBER GIVEN
- 367 826D AD 2B 80 BKPT1: LDA CF ;GET ARGUMENT FLAG
- 368 8270 30 46 BMI CLRALL ;POSSIBLE CLEAR ALL $B OR $NB/
- 369 8272 E0 00 CPX #0 ;SPECIFIC BREAK POINT
- 370 8274 10 0D BPL BKPT2 ; IF QUANT AFTER $
- 371 8276 A2 07 LDX #MAXBP-1 ;LOOK FOR A FREE ONE
- 372 8278 BD 50 80 5$: LDA BPINS,X
- 373 827B F0 06 BEQ BKPT2 ;FOUND IF ZERO
- 374 827D CA DEX ;STEP TO NEXT
- 375 827E 10 F8 BPL 5$ ; AND TRY AGAIN
- 376 8280 4C 9A 80 ERR2: JMP ERR ;BRANCH TO HERE FOR ERROR
- 377
- 378 ;X NOW CONTAINS AN INDEX INTO THE BP TABLES
- 379
- 380 8283 AD 34 80 BKPT2: LDA STARTA ;CHECK FOR 0$NB
- 381 8286 D0 05 BNE SETBP ;IF NOT ZERO CONTINUE
- 382 8288 AD 35 80 LDA STARTA+1 ;GET HIGH BYTE
- 383 828B F0 23 BEQ CLRONE ;CLEAR JUST ONE
- 384
- 385 ;NOW SET A BREAK POINT - ADDRS IN INTMP
- 386
- 387 828D SETBP: MOV2 STARTA,INBUF ;NEED IN PAGE 0 LOC
- (1) 828D AD 34 80
- (1) 8290 85 E0
- (1) 8292 AD 35 80
- (1) 8295 85 E1
- 388 8297 A0 00 LDY #0 ;SET FOR INDIRECT
- 389 8299 B1 E0 LDA (INBUF),Y ;FETCH INSTR
- 390 829B F0 E3 BEQ ERR2 ;ERROR IF 00
- 391 829D 9D 50 80 STA BPINS,X ;SAVE IN TABLE
- 392 82A0 A5 E0 LDA INBUF ;SAVE ADDRS
- 393 82A2 9D 60 80 STA BPLOCL,X ; LOW
- 394 82A5 A5 E1 LDA INBUF+1 ; AND HIGH
- 395 82A7 9D 68 80 STA BPLOCH,X ;...
- 396 ; ...
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 9
- ALBUG.M65
-
- 398 ; ...
- 399 82AA 20 62 87 BPXIT: CALL PRBLNK ;PRINT SOME SPACES
- 400 82AD 4C AB 80 JMP SCAN ;BACK TO DECODER
- 401
- 402
- 403 ;ROUTINE TO CLEAR ONE BREAKPOINT
- 404 ;C(X) - INDEX INTO BP TABLES, C(AC) := 0
- 405
- 406 82B0 9D 50 80 CLRONE: STA BPINS,X ;CLEAR BP
- 407 82B3 9D 58 80 STA BPCNT,X ; AND PROCEED COUNT
- 408 82B6 F0 F2 BEQ BPXIT ;RETURN
- 409
- 410 ;ROUTINE TO CLEAR ALL BREAK POINTS
- 411
- 412 82B8 E0 00 CLRALL: CPX #0 ;SPECIFIC BREAK POINT
- 413 82BA 10 10 BPL SHONE ;SHOW ONE BP
- 414 82BC A2 07 RALL: LDX #MAXBP-1 ;INIT COUNT
- 415 82BE A9 00 LDA #0 ;GET A ZERO
- 416 82C0 9D 50 80 5$: STA BPINS,X ;CLEAR BP
- 417 82C3 9D 58 80 STA BPCNT,X ;...
- 418 82C6 CA DEX
- 419 82C7 10 F7 BPL 5$ ;LOOP TILL DONE
- 420 82C9 4C 9D 80 JMP DCD ;RE-INIT THINGS
- 421
- 422
- 423 ;ROUTINE TO SHOW LOC OF BP
- 424
- 425 82CC 20 F0 86 SHONE: CALL GETSCH ;LOOK AHEAD CHAR
- 426 82CF C9 2F CMP #'/ ;GAURNTEE SLASH
- 427 82D1 D0 AD BNE ERR2
- 428 82D3 20 6B 87 CALL OUTSSP ;SPACE OVER
- 429 82D6 BD 50 80 LDA BPINS,X ;SEE IF ACTIVE
- 430 82D9 F0 A5 BEQ ERR2 ;NO - SORRY
- 431 82DB BD 68 80 LDA BPLOCH,X ;GET LOC HIGH
- 432 82DE 20 91 87 CALL PRTSBY ;PRINT IT
- 433 82E1 BD 60 80 LDA BPLOCL,X ;GET LOC LOW
- 434 82E4 20 91 87 CALL PRTSBY ;PRINT IT
- 435 82E7 4C 9D 80 JMP DCD ;CLOSE REG, ETC.
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 10
- ALBUG.M65
-
- 437 ;$D - JUMP TO DOS
- 438
- 439 82EA 6C 0A 00 TODOS: JMP (DOSVEC)
- 440
- 441 ;$U - SELECT DISK UNIT
- 442
- 443 82ED AD 34 80 SETU: LDA STARTA ;GET UNIT #
- 444 82F0 F0 8E BEQ ERR2 ;MUST BE 1-4
- 445 82F2 C9 05 CMP #5 ;VALID?
- 446 82F4 90 8A BCC ERR2 ;TOO LARGE
- 447 82F6 8D 3C 80 STA DRVNO ;STORE UNIT #
- 448 82F9 4C AA 82 JMP BPXIT ;RETURN
- 449
- 450 ;$W - WRITE DISK SECTORS FROM MEMORY
- 451
- 452 82FC 20 6A 86 WRSECT: CALL GETVAL ;BUFFER
- 453 82FF A9 57 LDA #DSKW ;WRITE COMMAND
- 454 8301 D0 05 BNE INIDSK ;DO IT
- 455
- 456 ;$R - READ DISK SECTORS INTO MEMORY
- 457
- 458 8303 20 6A 86 RDSECT: CALL GETVAL ;GET BUFFER ADDRS
- 459 8306 A9 52 LDA #DSKR ;READ COMMAND
- 460 8308 8D 02 03 INIDSK: STA DCOMND ;STORE
- 461 830B MOV2 INBUF,DBUFLO ;SETUP BUFFER
- (1) 830B A5 E0
- (1) 830D 8D 04 03
- (1) 8310 A5 E1
- (1) 8312 8D 05 03
- 462 8315 20 3E 86 CALL INTPTC ;SET POINT := START SECTOR
- 463 8318 A9 31 LDA #DSKCOD ;BUS I.D. FOR DISK
- 464 831A 8D 00 03 STA DDEVIC
- 465 831D AD 3C 80 LDA DRVNO ;SETUP DRIVE #
- 466 8320 8D 01 03 STA DUNIT
- 467 8323 A9 80 LDA #128 ;BYTE COUNT
- 468 8325 8D 08 03 STA DBYTLO
- 469 8328 CLR DBYTHI
- (1) 8328 A9 00
- (2) 832A 8D 09 03
- 470 832D DSKLUP: MOV2 POINT,DAUX1 ;SETUP SECTOR ADDRS
- (1) 832D A5 E2
- (1) 832F 8D 0A 03
- (1) 8332 A5 E3
- (1) 8334 8D 0B 03
- 471 8337 20 53 E4 CALL DSKINV ;INVOKE DISK HANDLER
- 472 833A 30 16 BMI IOCERR ;ERROR CODE IS .GE. $80
- 473 833C 20 58 86 CALL ENDCHK ;CHECK END, INCR POINT
- 474 833F 18 CLC ;NOT END - STEP TO NEXT BUFFER
- 475 8340 A9 80 LDA #128 ;128 BYTE/BUFFER
- 476 8342 6D 04 03 ADC DBUFLO
- 477 8345 8D 04 03 STA DBUFLO
- 478 8348 A9 00 LDA #0 ;PROPAGATE CARRY
- 479 834A 6D 05 03 ADC DBUFHI
- 480 834D 8D 05 03 STA DBUFHI
- 481 8350 D0 DB BNE DSKLUP ;LOOP TILL DONE
- 482
- 483 8352 20 DF 80 IOCERR: CALL ERRFST ;OUT <BELL>?
- 484 8355 20 6B 87 CALL OUTSSP
- 485 8358 AD 03 03 LDA DSTATS ;GET STATUS
- 486 835B 20 91 87 CALL PRTSBY ;PRINT ERROR CODE
- 487 835E 20 62 87 CALL PRBLNK ;SOME BLANKS
- 488 8361 20 8A 87 CALL PRTSPT ; THEN DISK ADDRS
- 489 8364 4C 9D 80 JMP DCD ;RETURN
- 490
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 11
- ALBUG.M65
-
- 492 ;$F - FIND A BYTE IN MEMORY
- 493
- 494 8367 20 6A 86 FIND: CALL GETVAL ;GET THE BYTE
- 495 836A 20 3E 86 CALL INTPTC ;SET UP INDIRECT POINTER FROM START
- 496 836D A9 01 LDA #1
- 497 836F 8D 2A 80 STA ROF ;SET THE MODE FLAG
- 498 8372 A0 00 10$: LDY #0 ;SET UP INDEX
- 499 8374 B1 E2 LDA (POINT),Y ;GET BYTE FROM MEMORY
- 500 8376 C5 E0 CMP INBUF ;DOES IT MATCH
- 501 8378 D0 08 BNE 20$ ;NO
- 502 837A A2 5B LDX #'[ ;SLASH
- 503 837C 20 25 87 CALL PRTSLC ;GO PRINT THE CONTENTS
- 504 837F 20 85 87 CALL CRLFS ;PUT OUT CARRIAGE RETURN LINE FEED
- 505 8382 20 58 86 20$: CALL ENDCHK ;ARE WE FINISHED
- 506 8385 4C 72 83 JMP 10$ ;NO
- 507
- 508
- 509 ;$G - START SOMEWHERE
- 510
- 511 8388 20 3E 86 GO: CALL INTPTC ;GO SETUP ADDRESS
- 512 838B CLR <BPN,SNGLF> ;CLEAR CURRENT BP
- (1) 838B A9 00
- (2) 838D 8D 3B 80
- (2) 8390 8D 3A 80
- 513 8393 20 5C 88 GO2: CALL INSB ;INSERT BP'S
- 514 8396 A6 E8 GO3: LDX SP ;RESTORE STACK
- 515 8398 9A TXS
- 516 8399 A5 E3 LDA POINT+1 ;SETUP RETURN ADDRS
- 517 839B 48 PHA ; ON STACK FOR RTI
- 518 839C A5 E2 LDA POINT
- 519 839E 48 PHA ;...
- 520 839F A5 E7 LDA PS ;PROCESSOR STATUS
- 521 83A1 48 PHA
- 522 83A2 A6 E5 LDX XREG ;RESTORE REGS
- 523 83A4 A4 E6 LDY YREG
- 524 83A6 A5 E4 LDA AC ;...
- 525 83A8 40 RTI ;GO BACK
- 526
- 527 ;HERE IF SINGLE STEP - SETUP FOR RE-ENTER AFTER XCT
- 528
- 529 83A9 AC 4F 85 GO1: LDY IOPC ;CHECK FOR JUMPS
- 530 83AC C0 4C CPY #$4C
- 531 83AE F0 0E BEQ GOJMP ;VANILLA JUMP
- 532 83B0 C0 6C CPY #$6C ;MAYBE JUMP, INDIRECT
- 533 83B2 F0 14 BEQ GOJMPI ; A LITTLE MORE HAIRY
- 534 83B4 C0 60 CPY #$60 ;"RTS"?
- 535 83B6 F0 2A BEQ IRTS ; INTERPRET SUBROUTINE RETURN
- 536 83B8 C0 40 CPY #$40 ;"RTI"
- 537 83BA F0 43 BEQ IRTI ; INTERPRET INTERRUPT RETURN
- 538 83BC D0 D8 BNE GO3 ; AND GO EXECUTE
- 539
- 540 83BE GOJMP: SET2 XCTBR,POINT ;EXECUTE HERE
- (1) 83BE A9 6C
- (1) 83C0 85 E2
- (1) 83C2 A9 85
- (1) 83C4 85 E3
- 541 83C6 D0 CE BNE GO3
- 542
- 543 83C8 GOJMPI: MOV2 XBTARG,POINT ;NEED TO PICK UP ACTUAL TARGET
- (1) 83C8 AD 7B 85
- (1) 83CB 85 E2
- (1) 83CD AD 7C 85
- (1) 83D0 85 E3
- 544 83D2 A0 00 LDY #0
- 545 83D4 B1 E2 LDA (POINT),Y
- 546 83D6 8D 7B 85 STA XBTARG ;AND SET UP FOR "BRANCH" SIMULATION
- 547 83D9 C8 INY ;SET TO NEXT LOC
- 548 83DA B1 E2 LDA (POINT),Y
- 549 83DC 8D 7C 85 STA XBTARG+1
- 550 83DF 4C BE 83 JMP GOJMP ;NO GO SIMULATE JMP (I)
- 551
- 552 83E2 A6 E8 IRTS: LDX SP ;GET STACK POINTER
- 553 83E4 9A TXS ;SETUP FOR "RTS" SIMULATION
- 554 83E5 68 IRTS1: PLA ;PCL
- 555 83E6 8D 7B 85 STA XBTARG
- 556 83E9 68 PLA ;PCH
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 11-1
- ALBUG.M65
-
- 557 83EA 8D 7C 85 STA XBTARG+1
- 558 83ED C0 40 CPY #$40 ;IS THIS SUBR OR INTERRUPT
- 559 83EF F0 08 BEQ 10$ ;DON'T INCREMENT PC IF "RTI"
- 560 83F1 EE 7B 85 INC XBTARG ;"RTS" NEED PC + 1
- 561 83F4 D0 03 BNE 10$
- 562 83F6 EE 7C 85 INC XBTARG+1
- 563 83F9 BA 10$: TSX ;SAVE MODIFIED STACK PNTR
- 564 83FA 86 E8 STX SP
- 565 83FC 4C BE 83 JMP GOJMP
- 566
- 567 83FF A6 E8 IRTI: LDX SP ;SETUP STACK POINTER
- 568 8401 9A TXS
- 569 8402 68 PLA ;GET PROCESSOR STATUS
- 570 8403 85 E7 STA PS
- 571 8405 4C E5 83 JMP IRTS1 ;GOIN COMMON CODE
- 572
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 12
- ALBUG.M65
-
- 574 ;$H - HEX DUMP TO TTY
- 575
- 576 8408 20 41 86 HDUMP: CALL INTPT ;SET UP START AND END ADDRESS
- 577 840B A5 E2 LDA POINT ;GET LOW PART OF ADDRESS
- 578 840D 29 F0 AND #$F0 ;MAKE IT START ON A NICE BOUNDRY
- 579 840F 85 E2 STA POINT
- 580 8411 20 A4 85 10$: CALL SETOUT ;SETUP OUTPUT DEVICE / GET LPP
- 581 8414 8D 2E 80 STA LENGTH ; SAVE IT AWAY
- 582 8417 20 85 87 20$: CALL CRLFS ;PRINT OUT CARRAGE RETURN LINEFEED
- 583 841A 20 8A 87 CALL PRTSPT ;PRINT OUT THE LOCATION
- 584 841D A9 10 LDA #$10 ;NUMBER OF BYTES PER LINE
- 585 841F 20 47 87 CALL DMPLIN ;PRINT A LINE OF DUMP
- 586 8422 20 58 86 CALL ENDCHK ;CHECK TO SEE IF WE ARE FINISHED
- 587 8425 CE 2E 80 DEC LENGTH ;COUNT LINE
- 588 8428 D0 ED BNE 20$ ;GO DO ANOTHER LINE
- 589 842A 20 DB 86 CALL PAGEWT ;GO WAIT FOR CONTINUE
- 590 842D 4C 11 84 JMP 10$ ;GO DO ANOTHER PAGE
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 13
- ALBUG.M65
-
- 592 ;$I - INITIALIZE MEMORY
- 593
- 594 8430 20 6A 86 INIT: CALL GETVAL ;GET VALUE
- 595 8433 A6 E0 LDX INBUF ;GET BYTE INTO X
- 596 8435 20 3E 86 INITM1: CALL INTPTC ;SET UP ADDRESSES
- 597 8438 8A 10$: TXA ;GET CHARACTER BACK
- 598 8439 A0 00 LDY #0 ;SET UP FOR INDEXING
- 599 843B 91 E2 STA (POINT),Y ;SET MEMORY TO SPECIFIED VALUE
- 600 843D 20 58 86 CALL ENDCHK ;CHECK TO SEE IF FINISHED
- 601 8440 4C 38 84 JMP 10$ ;NO GO DO ANOTHER VALUE
- 602
- 603
- 604 ;$Z - ZERO MEMORY
- 605
- 606 8443 A2 00 ZERO: LDX #0 ;GET A ZERO
- 607 8445 F0 EE BEQ INITM1 ;GO INITIALIZE MEMORY
- 608
- 609 ;$M - MOVE A BLOCK OF STORE
- 610
- 611 8447 A9 8D MOVE: LDA #$8D ;GET STORE OPCODE
- 612 8449 20 BB 87 CALL INTIVB ;SET UP STORE AND RETURN IN VEB
- 613 844C 20 6A 86 CALL GETVAL ;GET TO ADDRESS
- 614 844F 20 41 86 CALL INTPT ;SET UP POINT FROM START
- 615 8452 MOV2 INBUF,VEB+1 ;SET UP ADDRESS
- (1) 8452 A5 E0
- (1) 8454 8D 31 80
- (1) 8457 A5 E1
- (1) 8459 8D 32 80
- 616 845C A0 00 10$: LDY #0 ;SET UP FOR INDEXING
- 617 845E B1 E2 LDA (POINT),Y ;GET BYTE
- 618 8460 20 30 80 CALL VEB ;STORE IT AT NEW ADDRESS
- 619 8463 20 D7 87 CALL INCVEB ;BUMP THE VEB POINTER
- 620 8466 20 58 86 CALL ENDCHK ;FINISHED?
- 621 8469 4C 5C 84 JMP 10$ ;NO
- 622
- 623 ;$L - PRINTER SELECT TOGGLE
- 624
- 625 846C AD 34 80 PNTSEL: LDA STARTA ;COMPLIMENT PRINTER FLAG
- 626 846F 8D 3E 80 STA PNTF
- 627 8472 4C AA 82 JMP BPXIT ;RETURN TO MAIN LOOP
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 14
- ALBUG.M65
-
- 629 ;$O - CALCULATE BRANCH OFFSET
- 630
- 631 8475 20 62 87 OFFSET: CALL PRBLNK ;PUT OUT SOME BLANKS
- 632 8478 18 CLC ;MAKE FROM BE ONE MORE
- 633 8479 AD 36 80 LDA ENDAD ;GET FIRST OF TO ADDRESS
- 634 847C ED 34 80 SBC STARTA ;SUBTRACT FROM ADDRESS
- 635 847F AA TAX ;SAVE LOW ORDER PART OF ADDRESS
- 636 8480 AD 37 80 LDA ENDAD+1 ;GET HIGH PART OF TO ADDRESS
- 637 8483 ED 35 80 SBC STARTA+1 ;SUBTRACT FROM ADDRESS
- 638 8486 A8 TAY ;SAVE HIGH ORDER BYTE
- 639 8487 D0 05 BNE 10$ ;IF IT IS ZERO MAY BE LEGAL ADDRESS
- 640 8489 8A TXA ;GET LOW PART BACK
- 641 848A 10 0D BPL 30$ ;VALID ADDRESS
- 642 848C 30 07 BMI 20$ ;ELSE ILLEGAL ADDRESS
- 643 848E C9 FF 10$: CMP #$FF ;OR $FF IS LEGAL
- 644 8490 D0 03 BNE 20$
- 645 8492 8A TXA ;GET LOW PART BACK
- 646 8493 30 04 BMI 30$ ;VALID ADDRESS
- 647 8495 98 20$: TYA ;GET HIGH ORDER BYTE
- 648 8496 20 91 87 CALL PRTSBY ;GO PRINT HIGH ORDER BYTE
- 649 8499 8A 30$: TXA ;GET LOW ORDER BYTE
- 650 849A 20 91 87 CALL PRTSBY ;PRINT LOW BYTE
- 651 849D 20 85 87 CALL CRLFS ;AND CARRIAGE RETURN LINE FEED
- 652 84A0 4C AB 80 JMP SCAN ;GO BACK TO MAIN LOOP
- 653
- 654 ;$P - PROCEED FROM BREAKPOINT
- 655
- 656 84A3 20 85 87 PROC: CALL CRLFS ;SIGNAL START
- 657 84A6 CLR SNGLF ;NOT SINGLE STEP
- (1) 84A6 A9 00
- (2) 84A8 8D 3A 80
- 658 84AB AD 2B 80 LDA CF ;QUANT TYPED
- 659 84AE 30 07 BMI PROC1 ;NO - PROCEED ONCE
- 660 84B0 AD 34 80 LDA STARTA ;GET LOW BYTE OF COUNT
- 661 84B3 F0 0E BEQ PERR ;DON'T ALLOW 0$P
- 662 84B5 D0 02 BNE PROC2 ;PROCEED COUNT IN AC
- 663
- 664 84B7 A9 01 PROC1: LDA #1 ;PRELOAD A ONE
- 665 84B9 AE 3B 80 PROC2: LDX BPN ;ACTUAL BP #
- 666 84BC F0 10 BEQ IXCT ;COULD BE FROM PANIC INT
- 667 84BE 9D 57 80 STA BPCNT-1,X ;STORE COUNT
- 668 84C1 D0 0B BNE IXCT ;JOIN SS CODE
- 669
- 670 84C3 4C 9A 80 PERR: JMP ERR ;HANDY BRANCH LOC
- 671
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 15
- ALBUG.M65
-
- 673 ;$X - SINGLE STEP
- 674
- 675 84C6 EXEC: CLR BPN ;NO BREAKS IN PROGRESS
- (1) 84C6 A9 00
- (2) 84C8 8D 3B 80
- 676 84CB EE 3A 80 INC SNGLF ;SET FLAG
- 677
- 678 84CE IXCT: MOV2 PRPC,POINT ;SET START ADDRESS
- (1) 84CE AD 2C 80
- (1) 84D1 85 E2
- (1) 84D3 AD 2D 80
- (1) 84D6 85 E3
- 679 84D8 20 7E 89 CALL CALCAD ;GET LENGHT, EA, FORMAT
- 680 84DB MOV2 INBUF,XBTARG ;SET EA TO BRANCH TARGET
- (1) 84DB A5 E0
- (1) 84DD 8D 7B 85
- (1) 84E0 A5 E1
- (1) 84E2 8D 7C 85
- 681 84E5 A2 EA LDX #$EA ;GET NOP
- 682 84E7 8E 50 85 STX IOPC+1 ;INIT FOR 1 BYTE INSTR
- 683 84EA 8E 51 85 STX IOPC+2
- 684 84ED B1 E2 LDA (POINT),Y ;GET OPCODE
- 685 84EF D0 01 BNE 5$ ;CONVERT "BRK" INTO "NOP"
- 686 84F1 8A TXA
- 687 84F2 8D 4F 85 5$: STA IOPC
- 688 84F5 AD 2E 80 LDA LENGTH ;LENGTH OF INSTR
- 689 84F8 F0 3D BEQ IXCT1 ;1 BYTE - GO NOW
- 690 84FA 20 D0 87 CALL INCPT ;MOVE TO NEXT BYTE
- 691 84FD AD 2F 80 LDA PFRMT ;CHECK FOR BRANCH
- 692 8500 C9 1D CMP #$1D ; INSTR
- 693 8502 D0 07 BNE IXCT3 ;NOT BRANCH
- 694 8504 A9 1B LDA #XCTBR-IOPC-2 ;BRANCH - SET UP DISPLACEMENT
- 695 8506 8D 50 85 STA IOPC+1 ;STORE IN OFFSET BYTE
- 696 8509 D0 2C BNE IXCT1 ;JOIN COMMON EXIT
- 697
- 698 850B B1 E2 IXCT3: LDA (POINT),Y ;GET NEXT BYTE
- 699 850D 8D 50 85 STA IOPC+1 ;STORE IN XCT BLOCK
- 700 8510 AD 2E 80 LDA LENGTH
- 701 8513 C9 02 CMP #2 ;CHECK FOR 1 OR 2 EXTRA BYTES
- 702 8515 D0 20 BNE IXCT1 ;ONLY 1 BYTE
- 703 8517 20 D0 87 CALL INCPT ;MOVE TO NEXT
- 704 851A B1 E2 LDA (POINT),Y ;GET 3RD AND LAST
- 705 851C 8D 51 85 STA IOPC+2
- 706 851F AD 4F 85 LDA IOPC ;GET OPCODE BYTE
- 707 8522 C9 20 CMP #$20 ;IS IT "JSR"?
- 708 8524 D0 11 BNE IXCT1 ;BRANCH IF NOT
- 709 8526 A6 E8 LDX SP ;GET SAVED STACK POINTER
- 710 8528 9A TXS ;SET STACK
- 711 8529 A5 E3 LDA POINT+1 ;YES - SETUP RETURN PC
- 712 852B 48 PHA
- 713 852C A5 E2 LDA POINT
- 714 852E 48 PHA
- 715 852F BA TSX ;SAVE UPDATED POINTER
- 716 8530 86 E8 STX SP ; FOR PROCEED
- 717 8532 A9 4C LDA #$4C ;CHANGE INTO "JMP"
- 718 8534 8D 4F 85 STA IOPC
- 719 8537 20 D0 87 IXCT1: CALL INCPT ;STEP TO INSTR AFTER THIS ONE
- 720 853A MOV2 POINT,XNOBR ;SETUP NO BRANCH LOC
- (1) 853A A5 E2
- (1) 853C 8D 79 85
- (1) 853F A5 E3
- (1) 8541 8D 7A 85
- 721 8544 SET2 IOPC,POINT ;SET START ADDR TO IOPC BLOCK
- (1) 8544 A9 4F
- (1) 8546 85 E2
- (1) 8548 A9 85
- (1) 854A 85 E3
- 722 854C 4C A9 83 JMP GO1 ;AND START UP
- 723
- 724 ;EXECUTE BLOCK FOR INSTR XCT SIMULATOR
- 725
- 726 854F F0 1B IOPC: BEQ XCTBR
- 727 8551 EA .BYTE $EA ;NOP
- 728 8552 84 E6 STY YREG ;SAVE NEW STATE AFTER $X
- 729 8554 86 E5 STX XREG
- 730 8556 85 E4 STA AC
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 15-1
- ALBUG.M65
-
- 731 8558 08 PHP
- 732 8559 68 PLA
- 733 855A 85 E7 STA PS ;PROCESSOR STATUS
- 734 855C BA TSX
- 735 855D 86 E8 STX SP ;STACK POINTER
- 736 855F XCTNB: MOV2 XNOBR,POINT ;NO BRANCH OCCURED
- (1) 855F AD 79 85
- (1) 8562 85 E2
- (1) 8564 AD 7A 85
- (1) 8567 85 E3
- 737 8569 4C F3 88 JMP BRKY
- 738
- 739 856C XCTBR: MOV2 XBTARG,POINT ;BRANCH OCCURED
- (1) 856C AD 7B 85
- (1) 856F 85 E2
- (1) 8571 AD 7C 85
- (1) 8574 85 E3
- 740 8576 4C F3 88 JMP BRKY
- 741
- 742 8579 0001 XNOBR: .BLKW 1 ;SAVED POINTERS FOR SINGLE STEP
- 743 857B 0001 XBTARG: .BLKW 1
- 744
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 16
- ALBUG.M65
-
- 746 ;$Q - DISASSEMBLE CODE
- 747
- 748 857D 20 41 86 DISASS: CALL INTPT ;SET UP POINT
- 749 8580 20 A4 85 10$: CALL SETOUT ;SET OUTPUT DEVICE
- 750 8583 8D 2B 80 STA CF ; RETURNS LINES/PAGE
- 751 8586 20 85 87 20$: CALL CRLFS ;PUT OUT CARRIAGE RETURN LINE FEED
- 752 8589 20 1E 87 CALL PRTSLS ;GO PRINT A LINE
- 753 858C 20 58 86 CALL ENDCHK ;CHECK TO SEE IF FINISHED
- 754 858F AD 2E 80 LDA LENGTH ;GET LENGTH OF INSTRUCTION
- 755 8592 18 CLC ;ONE ALREADY ADDED AT ENDCHK
- 756 8593 20 04 8A CALL PCADJ3 ;POINT TO NEXT INSTRUCTION
- 757 8596 85 E2 STA POINT ;SAVE UPDATED ADDRESS
- 758 8598 84 E3 STY POINT+1
- 759 859A CE 2B 80 DEC CF ;ACCOUNT FOR LINE
- 760 859D D0 E7 BNE 20$ ;GO DO ANOTHER INSTRUCTION
- 761 859F 20 DB 86 CALL PAGEWT ;GO WAIT FOR GO AHEAD
- 762 85A2 D0 DC BNE 10$ ;GO DO ANOTHER PAGE
- 763
- 764 ;ROUTINE TO SETUP FOR OUTPUT - CHECK PNTF FOR PRINTER
- 765
- 766 85A4 AD 3E 80 SETOUT: LDA PNTF ;WANT PRINTER?
- 767 85A7 F0 06 BEQ 10$
- 768 85A9 20 E0 87 CALL OPENP ;YES - OPEN IT IF NOT OPEN ALREADY
- 769 85AC A9 37 LDA #LPP ;RETURN LINES/PAGE
- 770 85AE 60 RET
- 771
- 772 85AF A9 18 10$: LDA #LNSCR ;LINE/SCREEN (EDITOR)
- 773 85B1 60 RET
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 17
- ALBUG.M65
-
- 775 ;$S - SEARCH FOR ADDRESS
- 776
- 777 85B2 20 6A 86 SEARCH: CALL GETVAL ;GET A WORD
- 778 85B5 MOV2 INBUF,VEB ;SAVE VALUE SEARCHING FOR
- (1) 85B5 A5 E0
- (1) 85B7 8D 30 80
- (1) 85BA A5 E1
- (1) 85BC 8D 31 80
- 779 85BF 20 3E 86 CALL INTPTC ;SET UP ADDRESSES
- 780 85C2 20 4C 86 CALL DECPT ;DECREMENT IT BY ONE
- 781 85C5 A0 00 10$: LDY #0 ;SET UP INDEX
- 782 85C7 B1 E2 LDA (POINT),Y ;GET FIRST BYTE
- 783 85C9 CD 30 80 CMP VEB ;DOES IT MATCH
- 784 85CC D0 22 BNE 20$ ;NO
- 785 85CE C8 INY ;BUMP POINTER
- 786 85CF B1 E2 LDA (POINT),Y ;GET SECOND BYTE
- 787 85D1 CD 31 80 CMP VEB+1 ;DOES IT MATCH
- 788 85D4 D0 1A BNE 20$ ;NO
- 789 85D6 20 8A 87 CALL PRTSPT ;PRINT THE ADDRESS
- 790 85D9 A9 2F LDA #'/ ;PRINT SEPERATOR
- 791 85DB 20 6D 87 CALL OUTSCH ;PRINT IT
- 792 85DE 20 6B 87 CALL OUTSSP ;PUT OUT A SPACE
- 793 85E1 AD 31 80 LDA VEB+1 ;GET HIGH BYTE
- 794 85E4 20 91 87 CALL PRTSBY ;PRINT THE BYTE
- 795 85E7 AD 30 80 LDA VEB ;GET LOW BYTE
- 796 85EA 20 91 87 CALL PRTSBY ;PRINT IT
- 797 85ED 4C 0E 86 JMP 30$ ;GO DO CARRIAGE RETURN LINE FEED
- 798
- 799 85F0 20 7E 89 20$: CALL CALCAD ;GET EFFECTIVE ADDRESS OF INSTRUCTION
- 800 85F3 A5 E0 LDA INBUF ;GET LOW BYTE
- 801 85F5 CD 30 80 CMP VEB ;DOES IT MATCH
- 802 85F8 D0 17 BNE 40$ ;NO
- 803 85FA A5 E1 LDA INBUF+1 ;GET HIGH BYTE
- 804 85FC CD 31 80 CMP VEB+1 ;DOES IT MATCH
- 805 85FF D0 10 BNE 40$ ;NO
- 806 8601 20 1E 87 CALL PRTSLS ;GO PRINT THE CONTENTS
- 807 8604 AD 2F 80 LDA PFRMT ;
- 808 8607 C9 1D CMP #$1D ;CHECK TO SEE IF IT WAS A BRANCH
- 809 8609 F0 03 BEQ 30$ ;YES. NO NEED TO BUMP TWO
- 810 860B 20 D0 87 CALL INCPT ;BUMP POINTER SO WE DO NOT GET ADDRESS AGAIN
- 811 860E 20 85 87 30$: CALL CRLFS ;PUT OUT CARRIAGE RETURN LINE FEED
- 812 8611 20 58 86 40$: CALL ENDCHK ;ARE WE FINISHED
- 813 8614 4C C5 85 JMP 10$ ;NO
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 18
- ALBUG.M65
-
- 815 ;$T - TYPE OUT MEMORY IN ASCII
- 816
- 817 8617 20 3E 86 TYPE: CALL INTPTC ;SET UP ADDRESSES
- 818 861A A0 00 10$: LDY #0 ;SET UP FOR INDEXING
- 819 861C B1 E2 LDA (POINT),Y ;GET A CHARACTER
- 820 861E 20 6D 87 CALL OUTSCH ;PRINT THE CHARACTER
- 821 8621 20 58 86 CALL ENDCHK ;FINISHED?
- 822 8624 4C 1A 86 JMP 10$ ;NO
- 823
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 19
- ALBUG.M65
-
- 825 ;ROUTINES DEALING WITH POINT
- 826
- 827 ;REGISTER CLOSE ROUTINE
- 828 ;CLOSE LOCATION AND UPDATE IF NECESSARY
- 829
- 830 8627 A0 00 CLSE: LDY #0 ;PREPARE TO MODIFY
- 831 8629 AD 2A 80 LDA ROF ;GET FLAG
- 832 862C F0 0C BEQ CLSEX ;XFER IF NONE OPEN
- 833 862E 30 0A BMI CLSEX ; OR SYMBOLIC
- 834 8630 AD 2B 80 LDA CF ;ANYTHING TYPED?
- 835 8633 30 05 BMI CLSEX ;NO - DO NOTHING
- 836 8635 AD 34 80 LDA STARTA ; CURRENT OPEN REG
- 837 8638 91 E2 STA (POINT),Y ; WITH INPUT VALUE
- 838 863A 8C 2A 80 CLSEX: STY ROF ;SET REGISTER CLOSED
- 839 863D 60 RET ;RETURN
- 840
- 841
- 842 ;SET UP POINT FROM THE STARTING ADDRESS
- 843
- 844 863E 20 85 87 INTPTC: CALL CRLFS ;PUT OUT CARRIAGE RETURN LINE FEED FIRST
- 845 8641 INTPT: MOV2 STARTA,POINT
- (1) 8641 AD 34 80
- (1) 8644 85 E2
- (1) 8646 AD 35 80
- (1) 8649 85 E3
- 846 864B 60 RET
- 847
- 848
- 849 ;DECREMENT THE PC
- 850
- 851 864C 38 DECPT: SEC ;PREPARE TO DECREMENT POINT
- 852 864D A5 E2 LDA POINT
- 853 864F E9 01 SBC #1
- 854 8651 85 E2 STA POINT
- 855 8653 B0 02 BCS 10$
- 856 8655 C6 E3 DEC POINT+1 ;HANDLE BORROW
- 857 8657 60 10$: RET
- 858
- 859
- 860 ;CHECK TO SEE IF POINT IS AT END YET
- 861
- 862 8658 A5 E2 ENDCHK: LDA POINT ;CHECK TO SEE IF FINISHED
- 863 865A CD 36 80 CMP ENDAD
- 864 865D A5 E3 LDA POINT+1
- 865 865F ED 37 80 SBC ENDAD+1
- 866 8662 B0 03 BCS 20$ ;IF GREATER THAN, FINISHED
- 867 8664 4C D0 87 JMP INCPT ;INCREMENT THE POINTER
- 868
- 869 8667 4C 9D 80 20$: JMP DCD ;FINISHED GO BACK TO MAIN LOOP
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 20
- ALBUG.M65
-
- 871 ;ROUTINES TO PICK UP VALUES
- 872
- 873 ; GET ADDITIONAL VALUE, PROMPT FOR INPUT, ERROR IF NOT
- 874 ; TERMINATED BY <EOL>
- 875
- 876 866A 20 6B 87 GETVAL: CALL OUTSSP ;OUTPUT SPACE
- 877 866D A9 3A LDA #': ; AND PROMPT
- 878 866F 20 6D 87 CALL OUTSCH
- 879 8672 20 7C 86 CALL GETNUM
- 880 8675 C9 9B CMP #.ATEOL ;TERMINATED PROPERLY?
- 881 8677 F0 1E BEQ ABTRET ;YES - RETURN
- 882 8679 4C 9A 80 JMP ERR ;NOPE -ERROR
- 883
- 884 ;GET A NUMBER RETURN WITH TERMINATOR IN A
- 885
- 886 867C GETNUM: CLR2 INBUF ;CLEAR THE BUFFER
- (1) 867C A9 00
- (2) 867E 85 E0
- (2) 8680 85 E1
- 887 8682 20 A8 86 CALL PACKCH ;GET A CHARACTER
- 888 8685 D0 08 BNE ABTCHK ;IF NOT HEX RETURN WITH CHARACTER IN A
- 889 8687 EE 2B 80 INC CF ;SAY WE HAVE A NUMBER
- 890 868A 20 A8 86 10$: CALL PACKCH ;GO GET ANOTHER CHARACTER
- 891 868D F0 FB BEQ 10$ ;IF HEX GO GET ANOTHER CHARACTER
- 892 ;;; ... ; FALL INTO ABTCHK
- 893
- 894 ;CHECK FOR RUBOUT OR BREAK. IF FOUND RETURN TO COMMAND DECODER
- 895
- 896 868F C9 7E ABTCHK: CMP #.ATRUB ;RUBOUT
- 897 8691 F0 05 BEQ ABORT ;ABORT COMMAND
- 898 8693 C9 80 CMP #BRKABT ;BREAK TYPED
- 899 8695 F0 01 BEQ ABORT
- 900 8697 60 ABTRET: RET
- 901
- 902 8698 ABORT: TYPE EXES ;PUT OUT XXX
- (1) 8698 A2 A2
- (1) 869A A0 86
- (1) 869C 20 85 F3
- 903 869F 4C A3 80 JMP DCD4
- 904
- 905 86A2 20 20 58 EXES: .ASCII " XXX"<.ATEOL>
- 86A5 58 58 9B
- 906
- 907 ;GET A CHARACTER AND PACK IT
- 908
- 909 86A8 20 F0 86 PACKCH: CALL GETSCH ;GET THE CHARACTER
- 910 86AB C9 3A CMP #'9+1 ;CAN IT BE A NUMBER
- 911 86AD 30 10 BMI PACK ;YES GO TRY TO PACK IT
- 912 86AF C9 41 CMP #'A ;IS IT A CHARACTER
- 913 86B1 30 0A BMI 10$ ;NO. INVALID CHARACTER RETURN
- 914 86B3 C9 7E CMP #.ATRUB ;RUBOUT
- 915 86B5 F0 06 BEQ 10$ ;YES. INVALID CHARACTER RETURN
- 916 86B7 29 DF AND #@337 ;GET RID OF LOWERCASE BIT
- 917 86B9 C9 47 CMP #'F+1 ;IS IT G OR LARGER
- 918 86BB 30 02 BMI PACK ;NO. GO PACK IT
- 919 86BD A8 10$: TAY ;SIGNAL ILLEGAL CHARACTER
- 920 86BE 60 RET
- 921
- 922 86BF C9 30 PACK: CMP #'0 ;CHECK FOR HEX
- 923 86C1 30 17 BMI PACKX
- 924 86C3 C9 40 CMP #'A-1 ;ADJUST FOR A-F
- 925 86C5 30 03 BMI 10$
- 926 86C7 18 CLC ;BY ADDING OFFSET
- 927 86C8 69 09 ADC #$09
- 928 86CA 2A 10$: ROL A ;SHIFT IN
- 929 86CB 2A ROL A
- 930 86CC 2A ROL A
- 931 86CD 2A ROL A
- 932 86CE A0 04 LDY #$04 ;4 MORE SHIFTS THRU CARRY
- 933 86D0 2A 20$: ROL A ; TO MOVE INTO INBUF
- 934 86D1 26 E0 ROL INBUF
- 935 86D3 26 E1 ROL INBUF+1 ;RIPPLE BIT THROUGH
- 936 86D5 88 DEY ;COUNT LOOP
- 937 86D6 D0 F8 BNE 20$
- 938 86D8 A9 00 LDA #$00 ;RETURN A = 0 IF OK NUMBER
- 939 86DA 60 PACKX: RET
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 20-1
- ALBUG.M65
-
- 940
- 941 ;WAIT FOR A CHARACTER TO BE TYPED IF IT IS A RUBOUT RETURN TO COMMAND
- 942 ;DECODER
- 943
- 944 86DB AD 3D 80 PAGEWT: LDA PIOCB ;ARE WE PRINTING?
- 945 86DE F0 05 BEQ 10$
- 946 86E0 A9 0C LDA #@14 ;OUTPUT FF
- 947 86E2 4C 6D 87 JMP OUTSCH
- 948
- 949 86E5 A9 FD 10$: LDA #.ATBEL ;GET BELL
- 950 86E7 20 6D 87 CALL OUTSCH ;RING IT
- 951 86EA 20 F0 86 CALL GETSCH ;WAIT FOR CHARACTER
- 952 86ED 4C 8F 86 JMP ABTCHK ;CHECK FOR ABORT OR PROCEED
- 953
- 954 ;ROUTINE TO GET A CARACTER
- 955 ; RETURNS CHARACTER IN A
- 956 ; USES Y
- 957
- 958 86F0 8E 38 80 GETSCH: STX TEMPX ;SAVE X
- 959 86F3 8C 39 80 STY TEMPY ; AND Y AROUND O/S
- 960 86F6 A9 00 LDA #0
- 961 86F8 85 2A STA ICAX1Z ;CLEAR FLAG
- 962 86FA 20 E2 F6 CALL KGETCH ;RETURNS STATUS IN Y, CHAR IN A
- 963 86FD 30 0A BMI 20$ ;DON'T ECHO SPECIAL CHARS
- 964 86FF C9 7E CMP #.ATRUB ;CHECK BS/DEL KEY
- 965 8701 F0 0B BEQ 30$ ; RUBOUT DOESN'T ECHO
- 966 8703 C9 20 CMP #.CHSP ;CHECK FOR CONTROLS
- 967 8705 B0 6C BCS OUTSCN ; ECHO IF NOT
- 968 8707 90 05 BCC 30$ ;RETURN CHAR - NO ECHO
- 969
- 970 8709 C0 80 20$: CPY #BRKABT ;BREAK KEY TYPED?
- 971 870B D0 01 BNE 30$
- 972 870D 98 TYA ;YES - RETURN BREAK FLAG
- 973 870E AE 38 80 30$: LDX TEMPX ;RESTORE
- 974 8711 AC 39 80 LDY TEMPY
- 975 8714 60 RET ; ELSE RETURN
- 976
- 977 ;ROUTINE TO GET TWO HEX CARACTERS INTO AC
- 978 ; RETURNS CHARACTER IN A
- 979 ; X PRESERVED Y RETURNED = 0
- 980
- 981 8715 20 A8 86 GETSBY: CALL PACKCH ;GET A CHARACTER
- 982 8718 20 A8 86 CALL PACKCH ;GET ANOTHER CHARACTER
- 983 871B A5 E0 LDA INBUF ;LOAD UP BYTE
- 984 871D 60 RET
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 21
- ALBUG.M65
-
- 986 ;GENERAL PURPOSE PRINTING ROUTIMES
- 987
- 988 ;PRINT LOCATION AND IT'S CONTENETS IF FORM SPECIFIED BY ROF
- 989
- 990 871E A9 FF PRTSLS: LDA #$FF ;SET THE TYPEOUT MODE BACK
- 991 8720 8D 2A 80 STA ROF
- 992 8723 A2 2F LDX #'/ ;SLASH
- 993 8725 20 8A 87 PRTSLC: CALL PRTSPT ;PRINT CONTENTS OF POINT
- 994 8728 8A TXA ;GET CHAR BACK
- 995 8729 20 6D 87 CALL OUTSCH
- 996 872C 20 6B 87 CALL OUTSSP ; AND A SPACE
- 997 ;;; ... ; FALL INTO PRTSCN
- 998
- 999 ;PRINT OUT CONTENTS OF CURRENT LOCATION IN FORM SPECIFIED BY ROF
- 1000
- 1001 872F A0 00 PRTSCN: LDY #0 ;SET FOR GLOBAL INDEX
- 1002 8731 B1 E2 LDA (POINT),Y ;GET CURRENT LOCATION IN A
- 1003 8733 8D 34 80 STA STARTA ;SAVE FOR QUOTE OR EQUAL
- 1004 8736 AE 2A 80 LDX ROF ;SEE WHAT KIND
- 1005 8739 30 06 BMI 20$ ;BR IF SYMBOLIC
- 1006 873B 20 91 87 CALL PRTSBY ;PRINT CONTENTS
- 1007 873E 4C 6B 87 10$: JMP OUTSSP ;AWAIT NEXT REQUEST
- 1008
- 1009 8741 20 05 89 20$: CALL DSMBL ;PRINT SYMBOLIC
- 1010 8744 4C 3E 87 JMP 10$ ; AND RETURN TO CMD LOOP
- 1011
- 1012 ;DUMP NUMBER OF LOCATIONS IN A TO SCREEN
- 1013
- 1014 8747 8D 2F 80 DMPLIN: STA PFRMT ;SAVE IT
- 1015 874A 20 62 87 CALL PRBLNK ;SPACE OVER 2
- 1016 874D F0 06 BEQ 20$ ;DO NOT INCREMENT POINTER FIRST TIME
- 1017
- 1018 874F 20 D0 87 10$: CALL INCPT ;INCREMENT THE POINTER
- 1019 8752 20 6B 87 CALL OUTSSP ;PRINT BLANK
- 1020 8755 A0 00 20$: LDY #0 ;SET UP FOR INDEXING
- 1021 8757 B1 E2 LDA (POINT),Y ;GET LOCATION
- 1022 8759 20 91 87 CALL PRTSBY ;PRINT IT
- 1023 875C CE 2F 80 DEC PFRMT ;ACCOUNT FOR CHARACTER
- 1024 875F D0 EE BNE 10$ ;NOT FINISHED GO DO MORE
- 1025 8761 60 RET
- 1026
- 1027 ;OUTPUT NUMBER OF BLANKS IN X
- 1028
- 1029 8762 A2 02 PRBLNK: LDX #$2
- 1030 8764 20 6B 87 PRBL2: CALL OUTSSP
- 1031 8767 CA DEX
- 1032 8768 D0 FA BNE PRBL2 ;LOOP TILL COUNT = 0
- 1033 876A 60 RET
- 1034
- 1035
- 1036 ;ROUTINE TO OUTPUT CHARACTER TO OUTPUT PORT
- 1037 ; CHARACTER IN A
- 1038
- 1039 ; USES Y AND RETURNS CHARACTER IN A
- 1040
- 1041 876B A9 20 OUTSSP: LDA #.CHSP ;LOAD UP A BLANK
- 1042 876D 8E 38 80 OUTSCH: STX TEMPX ;SAVE X & Y AROUND O/S CALLS
- 1043 8770 8C 39 80 STY TEMPY
- 1044 8773 48 OUTSCN: PHA ;SAVE THE CHARACTER
- 1045 8774 A8 TAY ; AND MOVE TO Y
- 1046 8775 AE 3D 80 LDX PIOCB ;GET IOCB INDEX
- 1047 8778 A9 0B LDA #PUTCHR ;1 CHAR OUTPUT
- 1048 877A 20 10 88 CALL CIOC ;OUTPUT TO EDITOR/PRINTER
- 1049 877D AE 38 80 LDX TEMPX ;RESTORE X
- 1050 8780 AC 39 80 LDY TEMPY ;RESTORE Y
- 1051 8783 68 PLA
- 1052 8784 60 RET
- 1053
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 22
- ALBUG.M65
-
- 1055 ;ROUTINE TO WRITE OUT CARRIAGE RETURN LINE FEED
- 1056 ; USES A AND Y
- 1057
- 1058 8785 A9 9B CRLFS: LDA #.ATEOL
- 1059 8787 4C 6D 87 JMP OUTSCH ;WRITE IT OUT AND RETURN
- 1060
- 1061 ;ROUTINE TO PRINT CURRENT LOCATION
- 1062 ; PRINTS POINT
- 1063 ; USES A AND Y
- 1064
- 1065 878A A5 E3 PRTSPT: LDA POINT+1 ;GET HIGH ORDER BYTE
- 1066 878C 20 91 87 CALL PRTSBY
- 1067 878F A5 E2 LDA POINT ;GET LOW ORDER BYTE
- 1068 ;;; ... ;FALL INTO PRTSBY
- 1069
- 1070 ;ROUTINE TO PRINT BYTE AS TWO HEX DIGITS
- 1071 ; BYTE IS IN A
- 1072
- 1073 8791 48 PRTSBY: PHA ;SAVE THE BYTE
- 1074 8792 4A LSR A ;GET HIGH ORDER FOUR BITS
- 1075 8793 4A LSR A
- 1076 8794 4A LSR A
- 1077 8795 4A LSR A
- 1078 8796 20 9A 87 CALL HEXSTA ;GO CONVERT IT TO HEX
- 1079 8799 68 PLA ;GET THE ORGINAL BYTE BACK
- 1080 ;;; ... ; FALL INTO HEXSTA
- 1081
- 1082
- 1083 ;ROUTINE TO CONVERT A HEX DIGIT TO ASCII
- 1084 ; DIGIT IS IN A
- 1085
- 1086 879A 29 0F HEXSTA: AND #$0F ;GET JUST ONE DIGIT
- 1087 879C C9 0A CMP #$0A ;IS IT A DECIMAL DIGIT
- 1088 879E 18 CLC ;CLEAR THE CARRY
- 1089 879F 30 02 BMI HEXST1 ;IF NEGATIVE IT IS A DECIMAL DIGIT
- 1090 87A1 69 07 ADC #$07 ;ADD IN OFFSET TO GET A-F
- 1091 87A3 69 30 HEXST1: ADC #$30 ;CONVERT TO ASCII
- 1092 87A5 4C 6D 87 JMP OUTSCH ;GOT WRITE CHARACTER AND RETURN
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 23
- ALBUG.M65
-
- 1094 ; MISC ROUTINES
- 1095
- 1096 87A8 D8 INITS: CLD ;CLEAR DECIMAL MODE
- 1097 87A9 A9 02 LDA #LEDGE ;SET DEFAULT MARGINS
- 1098 87AB 85 52 STA LMARGN
- 1099 87AD A9 27 LDA #REDGE
- 1100 87AF 85 53 STA RMARGN
- 1101 87B1 A9 94 LDA #$94 ;SETUP BACKGROUND COLOR
- 1102 87B3 8D C8 02 STA COLOR4 ;TO BE SAME AS FOREGROUND
- 1103 87B6 4C 2E 88 JMP CLOSEP ;CLOSE PRINTER IF OPEN
- 1104
- 1105 ;SET UP VEB AREA
- 1106
- 1107 87B9 A9 AD INTSVB: LDA #$AD ;LDA OP CODE
- 1108 87BB 8D 30 80 INTIVB: STA VEB
- 1109 87BE AD 34 80 INTVEB: LDA STARTA ;SET UP SUB
- 1110 87C1 8D 31 80 STA VEB+1
- 1111 87C4 AD 35 80 LDA STARTA+1
- 1112 87C7 8D 32 80 STA VEB+2
- 1113 87CA A9 60 LDA #$60 ;"RTS"
- 1114 87CC 8D 33 80 STA VEB+3
- 1115 87CF 60 RET
- 1116
- 1117 ;ROUTINE TO INCRENT POINT
- 1118
- 1119 87D0 INCPT: INC2 POINT
- (1) 87D0 E6 E2
- (1) 87D2 D0 02
- (1) 87D4 E6 E3
- 1120 87D6 60 RET
- 1121
- 1122 ;ROUTINE TO INCREMENT ADDRS IN VEB
- 1123
- 1124 87D7 INCVEB: INC2 VEB+1
- (1) 87D7 EE 31 80
- (1) 87DA D0 03
- (1) 87DC EE 32 80
- 1125 87DF 60 INCRET: RET
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 24
- ALBUG.M65
-
- 1127 ;PRINTER ROUTINES
- 1128
- 1129 87E0 AD 3D 80 OPENP: LDA PIOCB ;CHECK IF ALREADY OPEN
- 1130 87E3 D0 FA BNE INCRET ;YES - DON'T REOPEN
- 1131 87E5 A2 10 LDX #$10 ;START AT IOCB#1
- 1132 87E7 BD 40 03 5$: LDA ICHID,X ;GET ID
- 1133 87EA C9 FF CMP #$FF ;FREE?
- 1134 87EC F0 0E BEQ THSONE
- 1135 87EE E0 70 CPX #$70 ;LAST ONE?
- 1136 87F0 F0 07 BEQ PNONE
- 1137 87F2 8A TXA ;STEP INDEX TO NEXT
- 1138 87F3 18 CLC
- 1139 87F4 69 10 ADC #$10
- 1140 87F6 AA TAX ;BACK TO X
- 1141 87F7 D0 EE BNE 5$
- 1142
- 1143 87F9 4C 9A 80 PNONE: JMP ERR ;NO FREE IOCB'S
- 1144
- 1145 ;FOUND FREE IOCB (INDEX IN X)
- 1146
- 1147 87FC 8E 3D 80 THSONE: STX PIOCB ;SAVE IOCB INDEX
- 1148 87FF A9 08 LDA #OPNOT ;OPEN FOR OUTPUT
- 1149 8801 9D 4A 03 STA ICAX1,X
- 1150 8804 SET2 PDEV,ICBAL,X ;POINT TO DEVICE TEXT
- (1) 8804 A9 3C
- (1) 8806 9D 44 03
- (1) 8809 A9 88
- (1) 880B 9D 45 03
- 1151 880E A9 03 LDA #OPEN ;OPEN COMMAND
- 1152 8810 9D 42 03 CIOC: STA ICCOM,X ;STORE COMMAND
- 1153 8813 A9 00 LDA #0 ;SET LENGTH TO ZERO
- 1154 8815 9D 48 03 STA ICBLL,X
- 1155 8818 9D 49 03 STA ICBLH,X
- 1156 881B 98 TYA ;MIGHT HAVE CHARACTER
- 1157 881C 20 56 E4 CALL CIOV ;INVOKE O/S
- 1158 881F 8C 03 03 STY DSTATS ;PUT COMPLETION CODE HERE
- 1159 8822 10 BB BPL INCRET ;RETURN IF NO ERROR
- 1160 8824 C0 80 CPY #BRKABT ;BREAK TYPED?
- 1161 8826 F0 03 BEQ 10$
- 1162 8828 4C 52 83 JMP IOCERR ;COMMON ERROR HANDLER
- 1163
- 1164 882B 4C 98 86 10$: JMP ABORT ;ABORT I/O - RETURN TO TOP LEVEL
- 1165
- 1166 ; CLOSE PRINTER IOCB
- 1167
- 1168 882E AE 3D 80 CLOSEP: LDX PIOCB ;SETUP IOCB INDEX
- 1169 8831 F0 AC BEQ INCRET ;RETURN IF NONE
- 1170 8833 CLR PIOCB ;FLAG NO PRINTER
- (1) 8833 A9 00
- (2) 8835 8D 3D 80
- 1171 8838 A9 0C LDA #CLOSE ;CLOSE COMMAND
- 1172 883A D0 D4 BNE CIOC ; INVOKE CIO
- 1173
- 1174 883C 50 3A 9B PDEV: .ASCII "P:"<.ATEOL>
- 1175
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 25
- ALBUG.M65
-
- 1177 ;GENERAL BREAKPOINT ROUTINES
- 1178
- 1179 ;ROUTINE TO REMOVE BREAKPOINTS
- 1180
- 1181 883F A2 07 REMB: LDX #MAXBP-1 ;COUNT OF THINGS TO DO
- 1182 8841 BD 50 80 5$: LDA BPINS,X ;GET INSTR OR ZERO
- 1183 8844 F0 05 BEQ 10$ ;NO BP IF ZERO
- 1184 8846 20 4F 88 CALL SETA ;SET UP ADDRS
- 1185 8849 91 E0 STA (INBUF),Y ;STORE INSTR
- 1186 884B CA 10$: DEX
- 1187 884C 10 F3 BPL 5$ ;LOOP OVER ALL
- 1188 884E 60 RET ;RETURN
- 1189
- 1190 ;SETUP ADDRS OF GIVEN BREAKPOINT FOR INDIRECT
- 1191 ;RETURNS INBUF WITH BPLOC,X , Y := 0
- 1192 ;PRESERVES AC
- 1193
- 1194 884F BC 60 80 SETA: LDY BPLOCL,X ;GET LOW ADDRS BYTE
- 1195 8852 84 E0 STY INBUF ;USE THIS AS TEMP
- 1196 8854 BC 68 80 LDY BPLOCH,X ;GET HIGH ADDRS BYTE
- 1197 8857 84 E1 STY INBUF+1
- 1198 8859 A0 00 LDY #0 ;SET FOR GLOBAL INDIRECT
- 1199 885B 60 RET ;RETURN
- 1200
- 1201 ;ROUTINE TO INSERT BREAKPOINTS
- 1202
- 1203 885C A2 07 INSB: LDX #MAXBP-1 ;DO ALL
- 1204 885E BD 50 80 5$: LDA BPINS,X ;SEE IF ACTIVE
- 1205 8861 F0 0C BEQ 10$ ;SKIP IF NO BP
- 1206 8863 20 4F 88 CALL SETA ;SET UP ADDRS
- 1207 8866 B1 E0 LDA (INBUF),Y ;GET OLD INSTR
- 1208 8868 9D 50 80 STA BPINS,X ;SAVE OLD INSTR
- 1209 886B A9 00 LDA #0 ;PUT BREAK IN PLACE
- 1210 886D 91 E0 STA (INBUF),Y ;...
- 1211 886F CA 10$: DEX
- 1212 8870 10 EC BPL 5$ ;LOOP TILL DONE
- 1213 8872 60 RET ;RETURN
- 1214
- 1215 ;INTERUPT SERVICES
- 1216
- 1217 ;IRQ - <BRK> INSTRUCTION OR ACTUAL APPLICATION INT.
- 1218
- 1219 8873 68 BREAK: PLA ;AC IS ON STACK
- 1220 8874 85 E4 STA AC ;SAVE ACCUM
- 1221 8876 68 PLA ;PROCESSOR STATUS
- 1222 8877 85 E7 STA PS
- 1223 8879 84 E6 STY YREG ;SAVE INDEX REGS
- 1224 887B 86 E5 STX XREG
- 1225 887D 68 PLA ;PC LOW
- 1226 887E 38 SEC ;DECREMENT PC TO REAL LOC
- 1227 887F E9 02 SBC #2 ;ADJUST PC FOR ACTUAL BP LOC
- 1228 8881 8D 2C 80 10$: STA PRPC ;SAVE HERE FOR $P
- 1229 8884 85 E2 STA POINT ;SAVE HERE FOR EXAMINE
- 1230 8886 68 PLA ;PC HIGH
- 1231 8887 B0 02 BCS 20$ ;CHECK BORROW
- 1232 8889 E9 00 SBC #0 ;ADJUST BY 1
- 1233 888B 8D 2D 80 20$: STA PRPC+1
- 1234 888E 85 E3 STA POINT+1
- 1235 8890 BA TSX ;GET STACK PNTR
- 1236 8891 86 E8 STX SP ; SAVE IT AWAY
- 1237 8893 20 3F 88 CALL REMB ;REMOVE BREAKPOINTS NOW
- 1238 8896 A2 08 LDX #MAXBP ;SEARCH FOR BPN
- 1239 8898 BD 4F 80 25$: LDA BPINS-1,X ;ACTIVE BP?
- 1240 889B F0 08 BEQ 30$ ;NO - SKIP TO NEXT
- 1241 889D AD 2D 80 LDA PRPC+1 ;GET PC HIGH
- 1242 88A0 DD 67 80 CMP BPLOCH-1,X ;MATCH?
- 1243 88A3 F0 08 BEQ 35$ ;YES - TRY FOR LOW
- 1244 88A5 CA 30$: DEX ;STEP TO NEXT
- 1245 88A6 D0 F0 BNE 25$ ; MORE TO DO
- 1246 88A8 8E 3B 80 STX BPN ;SIGNAL NO B.P.
- 1247 88AB F0 25 BEQ BRKX ;NONE FOUND (MAYBE PANIC)
- 1248 ;..
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 26
- ALBUG.M65
-
- 1250 ;..
- 1251
- 1252 88AD AD 2C 80 35$: LDA PRPC ;GET PC LOW
- 1253 88B0 DD 5F 80 CMP BPLOCL-1,X ;MATCH?
- 1254 88B3 D0 F0 BNE 30$ ;NO - KEEP LOOKING
- 1255
- 1256 ;ACTUAL BPN IN X
- 1257
- 1258 88B5 8E 3B 80 STX BPN ;SAVE BPN
- 1259 88B8 BD 57 80 LDA BPCNT-1,X ;BREAT THIS TIME? (0)
- 1260 88BB F0 15 BEQ BRKX ;BREAK IF ZERO
- 1261 88BD DE 57 80 DEC BPCNT-1,X ;COUNT THIS TIME
- 1262 88C0 F0 10 BEQ BRKX ; AND DO AUTO PROC (IF .NE. 0)
- 1263 88C2 CLR SNGLF ; NOT SINGLE STEP
- (1) 88C2 A9 00
- (2) 88C4 8D 3A 80
- 1264 88C7 SETXA IXCT ;EXIT THROUGH HERE
- (1) 88C7 A2 CE
- (1) 88C9 A9 84
- 1265 88CB 48 BRKRTI: PHA ;SAVE HIGH PC
- 1266 88CC 8A TXA ;GET LOW
- 1267 88CD 48 PHA ;SAVE IT TOO
- 1268 88CE A5 E7 LDA PS
- 1269 88D0 48 PHA ;CURRENT PROCESSOR STATUS
- 1270 88D1 40 RTI ;DISMISS TO ROUTINE
- 1271
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 27
- ALBUG.M65
-
- 1273 ;HERE TO ENTER BREAKPOINT - CLEAR SINGLE STEP FLAG
- 1274
- 1275 88D2 BRKX: CLR SNGLF ; CLEAR SS FLAG
- (1) 88D2 A9 00
- (2) 88D4 8D 3A 80
- 1276 88D7 SETXA DOBRK
- (1) 88D7 A2 DD
- (1) 88D9 A9 88
- 1277 88DB D0 EE BNE BRKRTI ;EXIT INT TO DOBRK
- 1278
- 1279 88DD 20 85 87 DOBRK: CALL CRLFS ;PUT OUT A CR/LF
- 1280 88E0 A9 42 LDA #'B ;PRINT BN;ADDRS
- 1281 88E2 20 6D 87 CALL OUTSCH
- 1282 88E5 AD 3B 80 LDA BPN ;MAYBE 0
- 1283 88E8 20 9A 87 CALL HEXSTA ;TYPE LOW 4 BITS
- 1284 88EB A9 3B LDA #';
- 1285 88ED 20 6D 87 CALL OUTSCH
- 1286 88F0 4C BC 81 JMP LFDS1 ;GO PRINT OUT ADDRESS AND INSTR.
- 1287
- 1288 88F3 BRKY: MOV2 POINT,PRPC ;SINGLE STEP ENTRY - POINT HAS PC
- (1) 88F3 A5 E2
- (1) 88F5 8D 2C 80
- (1) 88F8 A5 E3
- (1) 88FA 8D 2D 80
- 1289 88FD AD 3A 80 LDA SNGLF ;WAS THIS SINGLE STEP?
- 1290 8900 D0 DB BNE DOBRK ; SIMULATE BREAK IF $X
- 1291 8902 4C 93 83 JMP GO2 ;ELSE - JUST PROCEED
- 1292
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 28
- ALBUG.M65 6502 DISASSEMBLER
-
- 1294 .SBTTL 6502 DISASSEMBLER
- 1295
- 1296
- 1297 8905 20 7E 89 DSMBL: CALL CALCAD ;CALCULATE EFFECTIVE ADDRESS
- 1298 8908 48 PHA ;SAVE MNEMONIC TABLE INDEX
- 1299 8909 B1 E2 PROP: LDA (POINT),Y ;GET OP AND PRINT IT
- 1300 890B 20 91 87 CALL PRTSBY
- 1301 890E A2 01 LDX #$1 ;ONE SPACE
- 1302 8910 20 64 87 10$: CALL PRBL2
- 1303 8913 CC 2E 80 CPY LENGTH ;PRINT INSTR (1 TO 3 BYTES)
- 1304 8916 C8 INY ; IN A 12-CHAR FIELD
- 1305 8917 90 F0 BCC PROP
- 1306 8919 A2 03 LDX #$3 ;CHAR COUNT FOR MNEMONIC PRINT
- 1307 891B C0 04 CPY #$4
- 1308 891D 90 F1 BCC 10$
- 1309 891F 68 PLA ;RECOVER MNEMONIC INDEX
- 1310 8920 A8 TAY
- 1311 8921 B9 6E 8A LDA MNEML,Y
- 1312 8924 8D 32 80 STA LMNEM ;FETCH 3-CHAR MNEMONIC
- 1313 8927 B9 AE 8A LDA MNEMR,Y ; (PACKED IN 2 BYTES)
- 1314 892A 8D 33 80 STA RMNEM
- 1315 892D A9 00 PRMN1: LDA #$0
- 1316 892F A0 05 LDY #$5
- 1317 8931 0E 33 80 PRMN2: ASL RMNEM
- 1318 8934 2E 32 80 ROL LMNEM ;SHIFT 5 BITS OF CHAR INTO A
- 1319 8937 2A ROL A ; (CLEARS CARRY)
- 1320 8938 88 DEY
- 1321 8939 D0 F6 BNE PRMN2
- 1322 893B 69 3F ADC #$3F ;ADD '?' OFFSET
- 1323 893D 20 6D 87 CALL OUTSCH
- 1324 8940 CA DEX
- 1325 8941 D0 EA BNE PRMN1
- 1326 8943 20 62 87 CALL PRBLNK ;PRINT 3 BLANKS
- 1327 8946 A2 06 LDX #$6 ;COUNT FOR 6 PRINT FORMAT BITS
- 1328 8948 E0 03 PRADR1: CPX #$3
- 1329 894A D0 1B BNE PRADR3 ;IF X=3 THEN PRINT ADDRESS VAL
- 1330 894C AC 2E 80 LDY LENGTH
- 1331 894F F0 16 BEQ PRADR3 ;NO PRINT IF LENGTH=0
- 1332 8951 AD 2F 80 LDA PFRMT
- 1333 8954 C9 E8 CMP #$E8 ;HANDLE REL ADDRESSING MODE
- 1334 8956 D0 06 BNE PRADR2 ;IF NOT DO NOT ADJUST NUMBER OF BYTES
- 1335 8958 C8 INY ;IF RELATIVE BRANCH PRINT 2 BYTES
- 1336 8959 CLR PFRMT ;CLEAR PFRMT
- (1) 8959 A9 00
- (2) 895B 8D 2F 80
- 1337 895E B9 DF 00 PRADR2: LDA INBUF-1,Y ;SPECIAL (PRINT TARGET ADDRS)
- 1338 8961 20 91 87 CALL PRTSBY ;OUTPUT 1 OR 2 BYTE ADDRS
- 1339 8964 88 DEY ; MSB FIRST
- 1340 8965 D0 F7 BNE PRADR2
- 1341 8967 0E 2F 80 PRADR3: ASL PFRMT ;TEST NEXT PRINT FORMAT BIT
- 1342 896A 90 0E BCC PRADR4 ;IF 0, DON'T PRINT
- 1343 896C BD 61 8A LDA CHAR1-1,X ; CORRESPONDING CHARS
- 1344 896F 20 6D 87 CALL OUTSCH ;OUTPUT 1 OR 2 CHARS
- 1345 8972 BD 67 8A LDA CHAR2-1,X ; (IF CHAR FROM CHAR2 IS 0,
- 1346 8975 F0 03 BEQ PRADR4 ; DON'T OUTPUT IT)
- 1347 8977 20 6D 87 CALL OUTSCH
- 1348 897A CA PRADR4: DEX
- 1349 897B D0 CB BNE PRADR1
- 1350 897D 60 RET
- 1351
- 1352
- 1353 ;SET UP LENGTH, PFRMT AND EFFECTIV ADDRESS
- 1354 ; RETURNS INDEX INTO MNEMONIC TABLES IN A AND 0 IN Y
- 1355
- 1356 897E A0 00 CALCAD: LDY #0 ;SET UP FOR INDEXING
- 1357 8980 84 E1 STY INBUF+1 ;ZERO HIGH BYTE OF ADDRESS IN CASE ONLY ONE BYTE
- 1358 8982 B1 E2 LDA (POINT),Y ;GET OPCODE
- 1359 8984 A8 TAY ;SAVE IN Y
- 1360 8985 4A LSR A ; EVEN/ODD TEST
- 1361 8986 90 0B BCC IEVEN
- 1362 8988 4A LSR A ; TEST B1
- 1363 8989 B0 17 BCS IERR ; XXXXXX11 INSTR INVALID
- 1364 898B C9 22 CMP #$22
- 1365 898D F0 13 BEQ IERR ; 10001001 INSTR INVALID
- 1366 898F 29 07 AND #$7 ;MASK 3 BITS FOR ADDRS MODE
- 1367 8991 09 80 ORA #$80 ; ADD INDEXING OFFSET.
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 28-1
- ALBUG.M65 6502 DISASSEMBLER
-
- 1368 8993 4A IEVEN: LSR A ;LSB INTO CARRY FOR
- 1369 8994 AA TAX ; LEFT/RIGHT TEST BELOW.
- 1370 8995 BD 10 8A LDA MODE1,X ;INDEX INTO ADDRS MODE TABLE
- 1371 8998 B0 04 BCS RTMODE ;IF CARRY SET USE LSD FOR
- 1372 899A 4A LSR A ; PRINT FORMAT INDEX.
- 1373 899B 4A LSR A
- 1374 899C 4A LSR A
- 1375 899D 4A LSR A ; IF CARRY CLEAR, USE MSD
- 1376 899E 29 0F RTMODE: AND #$F ;MASK FOR 4-BIT INDEX
- 1377 89A0 D0 04 BNE GETFMT ; 0 FOR INVALID OPCODES
- 1378 89A2 A0 80 IERR: LDY #$80 ;SUBSTITUTE $80 FOR INVALID OP.
- 1379 89A4 A9 00 LDA #$0 ;SET PRINT FORMAT TO 0
- 1380 89A6 AA GETFMT: TAX
- 1381 89A7 BD 54 8A LDA MODE2,X ;INDEX INTO PRINT FORMAT TABLE
- 1382 89AA 8D 2F 80 STA PFRMT ;SAVE FOR ADDRESS FIELD FORMAT
- 1383 89AD 29 03 AND #$3 ;MASK 2-BIT LENGTH 0 = 1-BYTE,
- 1384 89AF 8D 2E 80 STA LENGTH ; 1 = 2-BYTE, 2 = 3-BYTE.
- 1385 89B2 98 TYA ;RESTORE OP CODE
- 1386 89B3 48 PHA ;SAVE OPCODE ON STACK
- 1387 89B4 AC 2E 80 LDY LENGTH ;GET LENGTH
- 1388 89B7 F0 13 BEQ 10$ ;IF ZERO SET CURRENT ADDRESS IN INBUF FOR TAB
- 1389 89B9 B1 E2 LDA (POINT),Y ;GET FIRST BYTE OF ADDRESS
- 1390 89BB C0 01 CPY #1 ;IS IT A 2 BYTE INSTRUCTION
- 1391 89BD D0 16 BNE 20$ ;NO GO PRINT BOTH BYTES
- 1392 89BF E0 0D CPX #13 ;WAS INDEX TO MODE2 FOR RELATIVE
- 1393 89C1 D0 17 BNE 30$ ;NO GO DO JUST ONE BYTE
- 1394 89C3 20 F7 89 CALL RELADR ;GO CALCULATE RELATIVE ADDRESS
- 1395 89C6 84 E1 STY INBUF+1 ;SAVE HIGH ORDER BYTE
- 1396 89C8 8A TXA ;GET LOW ORDER BYTE BACK
- 1397 89C9 4C DA 89 JMP 30$ ;GO FINISH UP
- 1398
- 1399 89CC A5 E3 10$: LDA POINT+1 ;GET HIGH ORDER BYTE OF ADDRESS
- 1400 89CE 85 E1 STA INBUF+1 ;AND SAVE IT
- 1401 89D0 A5 E2 LDA POINT ;GET LOW BYTE
- 1402 89D2 4C DA 89 JMP 30$ ;GO SAVE IT AND FINISH
- 1403
- 1404 89D5 85 E1 20$: STA INBUF+1 ;SAVE HIGH BYTE OF ADDRESS
- 1405 89D7 88 DEY ;SET TO GET LOW ORDER BYTE
- 1406 89D8 B1 E2 LDA (POINT),Y ;GET LOW BYTE
- 1407 89DA 85 E0 30$: STA INBUF ;SAVE LOW BYTE OF ADDRESS
- 1408 89DC 68 PLA ;GET OPCODE BACK
- 1409 89DD A8 TAY ;AND SAVE IT IN Y
- 1410 89DE 29 8F AND #$8F ;MASK IT FOR 1XXX1010 TEST
- 1411 89E0 AA TAX ; AND SAVE IT.
- 1412 89E1 98 TYA ;OPCODE AGAIN
- 1413 89E2 A0 03 LDY #$3
- 1414 89E4 E0 8A CPX #$8A
- 1415 89E6 F0 0B BEQ 60$
- 1416 89E8 4A 40$: LSR A
- 1417 89E9 90 08 BCC 60$ ;FORM INDEX INTO MNEMONIC TABLE
- 1418 89EB 4A LSR A
- 1419 89EC 4A 50$: LSR A ; 1XXX1010 -> 00101XXX
- 1420 89ED 09 20 ORA #$20 ; XXXYYY01 -> 00111XXX
- 1421 89EF 88 DEY ; XXXYYY10 -> 00110XXX
- 1422 89F0 D0 FA BNE 50$ ; XXXYY100 -> 00100XXX
- 1423 89F2 C8 INY ; XXXXX000 -> 000XXXXX
- 1424 89F3 88 60$: DEY
- 1425 89F4 D0 F2 BNE 40$
- 1426 89F6 60 RET
- 1427
- 1428
- 1429 ;HERE TO HANDLE RELATIVE BRANCH ADDRS
- 1430
- 1431 89F7 20 04 8A RELADR: CALL PCADJ3 ;PCL,H + DISPL + 1 TO A,Y
- 1432 89FA AA TAX
- 1433 89FB E8 INX
- 1434 89FC D0 01 BNE 10$ ; +1 TO X,Y
- 1435 89FE C8 INY
- 1436 89FF 60 10$: RET
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 29
- ALBUG.M65 6502 DISASSEMBLER
-
- 1438 ;ADD LENGTH TO POINT
- 1439
- 1440 8A00 AD 2E 80 PCADJ: LDA LENGTH ;0=1-BYTE, 1=2-BYTE, 2=3-BYTE
- 1441 8A03 38 SEC
- 1442 8A04 A4 E3 PCADJ3: LDY POINT+1
- 1443 8A06 AA TAX ;TEST DISPL SIGN (FOR REL
- 1444 8A07 10 01 BPL 10$ ; BRANCH). EXTEND NEG
- 1445 8A09 88 DEY ; BY DECREMENTING PCH.
- 1446 8A0A 65 E2 10$: ADC POINT
- 1447 8A0C 90 01 BCC 20$ ;PCL+LENGTH (OR DISPL) +1 TO A.
- 1448 8A0E C8 INY ;CARRY INTO Y (PCH)
- 1449 8A0F 60 20$: RET
- 1450
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 30
- ALBUG.M65 6502 DISASSEMBLER
-
- 1452 ;TABLES
- 1453
- 1454 8A10 40 MODE1: .BYTE $40
- 1455 8A11 02 .BYTE $2
- 1456 8A12 45 .BYTE $45
- 1457 8A13 03 .BYTE $3
- 1458 8A14 D0 .BYTE $D0
- 1459 8A15 08 .BYTE $8
- 1460 8A16 40 .BYTE $40
- 1461 8A17 09 .BYTE $9
- 1462 8A18 30 .BYTE $30 ;XXXXXXZ0 INSTRS.
- 1463 8A19 22 .BYTE $22
- 1464 8A1A 45 .BYTE $45 ; Z=0, LEFT HALF-BYTE
- 1465 8A1B 33 .BYTE $33 ; Z=1, RIGHT HALF-BYTE
- 1466 8A1C D0 .BYTE $D0
- 1467 8A1D 08 .BYTE $8
- 1468 8A1E 40 .BYTE $40
- 1469 8A1F 09 .BYTE $9
- 1470 8A20 40 .BYTE $40
- 1471 8A21 02 .BYTE $2
- 1472 8A22 45 .BYTE $45
- 1473 8A23 33 .BYTE $33
- 1474 8A24 D0 .BYTE $D0
- 1475 8A25 08 .BYTE $8
- 1476 8A26 40 .BYTE $40
- 1477 8A27 09 .BYTE $9
- 1478 8A28 40 .BYTE $40
- 1479 8A29 02 .BYTE $2 ;(WAS 0)
- 1480 8A2A 45 .BYTE $45 ;(WAS 40)
- 1481 8A2B B3 .BYTE $B3 ;(WAS B0)
- 1482 8A2C D0 .BYTE $D0
- 1483 8A2D 08 .BYTE $8 ;(WAS 0)
- 1484 8A2E 40 .BYTE $40
- 1485 8A2F 09 .BYTE $9 ;(WAS 0)
- 1486 8A30 00 .BYTE $0
- 1487 8A31 22 .BYTE $22
- 1488 8A32 44 .BYTE $44
- 1489 8A33 33 .BYTE $33
- 1490 8A34 D0 .BYTE $D0
- 1491 8A35 8C .BYTE $8C
- 1492 8A36 44 .BYTE $44
- 1493 8A37 00 .BYTE $0
- 1494 8A38 11 .BYTE $11
- 1495 8A39 22 .BYTE $22
- 1496 8A3A 44 .BYTE $44
- 1497 8A3B 33 .BYTE $33
- 1498 8A3C D0 .BYTE $D0
- 1499 8A3D 8C .BYTE $8C
- 1500 8A3E 44 .BYTE $44
- 1501 8A3F 9A .BYTE $9A
- 1502 8A40 10 .BYTE $10
- 1503 8A41 22 .BYTE $22
- 1504 8A42 44 .BYTE $44
- 1505 8A43 33 .BYTE $33
- 1506 8A44 D0 .BYTE $D0
- 1507 8A45 08 .BYTE $8
- 1508 8A46 40 .BYTE $40
- 1509 8A47 09 .BYTE $9
- 1510 8A48 10 .BYTE $10
- 1511 8A49 22 .BYTE $22
- 1512 8A4A 44 .BYTE $44
- 1513 8A4B 33 .BYTE $33
- 1514 8A4C D0 .BYTE $D0
- 1515 8A4D 08 .BYTE $8
- 1516 8A4E 40 .BYTE $40
- 1517 8A4F 09 .BYTE $9
- 1518 8A50 62 .BYTE $62
- 1519 8A51 13 .BYTE $13 ;YYXXXZ01 INSTRS.
- 1520 8A52 78 .BYTE $78
- 1521 8A53 A9 .BYTE $A9
- 1522
- 1523 8A54 00 MODE2: .BYTE $0 ;ERR
- 1524 8A55 21 .BYTE $21 ;IMM
- 1525 8A56 01 .BYTE $1 ;Z-PAG (WAS 81)
- 1526 8A57 02 .BYTE $2 ;ABS (WAS 82)
- 1527 8A58 00 .BYTE $0 ;IMPL
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 30-1
- ALBUG.M65 6502 DISASSEMBLER
-
- 1528 8A59 80 .BYTE $80 ;ACC (WAS 0)
- 1529 8A5A 59 .BYTE $59 ;(Z-PAG,X)
- 1530 8A5B 4D .BYTE $4D ;(Z-PAG),Y
- 1531 8A5C 11 .BYTE $11 ;Z-PAG,X (WAS 91)
- 1532 8A5D 12 .BYTE $12 ;ABS,X (WAS 92)
- 1533 8A5E 06 .BYTE $6 ;ABS,Y (WAS 86)
- 1534 8A5F 4A .BYTE $4A ;(ABS)
- 1535 8A60 05 .BYTE $5 ;Z-PAG,Y (WAS 85)
- 1536 8A61 1D .BYTE $1D ;REL (WAS 9D)
- 1537
- 1538 8A62 2C CHAR1: .BYTE ', ;COMMA
- 1539 8A63 29 .BYTE ') ;RPAREN
- 1540 8A64 2C .BYTE ', ;COMMA
- 1541 8A65 23 .BYTE '# ;SHARP
- 1542 8A66 28 .BYTE '( ;LPAREN
- 1543 8A67 41 .BYTE 'A ;(WAS '$)
- 1544
- 1545 8A68 59 CHAR2: .BYTE 'Y
- 1546 8A69 00 .BYTE 0 ;NULL
- 1547 8A6A 58 .BYTE 'X
- 1548 8A6B 00 .BYTE 0 ;(WAS '$)
- 1549 8A6C 00 .BYTE 0 ;(WAS '$)
- 1550 8A6D 00 .BYTE 0
- 1551
- 1552 8A6E 1C MNEML: .BYTE $1C ;XXXXX000 INSTRS.
- 1553 8A6F 8A .BYTE $8A
- 1554 8A70 1C .BYTE $1C
- 1555 8A71 23 .BYTE $23
- 1556 8A72 5D .BYTE $5D
- 1557 8A73 8B .BYTE $8B
- 1558 8A74 1B .BYTE $1B
- 1559 8A75 A1 .BYTE $A1
- 1560 8A76 9D .BYTE $9D
- 1561 8A77 8A .BYTE $8A
- 1562 8A78 1D .BYTE $1D
- 1563 8A79 23 .BYTE $23
- 1564 8A7A 9D .BYTE $9D
- 1565 8A7B 8B .BYTE $8B
- 1566 8A7C 1D .BYTE $1D
- 1567 8A7D A1 .BYTE $A1
- 1568 8A7E 00 .BYTE $0
- 1569 8A7F 29 .BYTE $29
- 1570 8A80 19 .BYTE $19
- 1571 8A81 AE .BYTE $AE
- 1572 8A82 69 .BYTE $69
- 1573 8A83 A8 .BYTE $A8
- 1574 8A84 19 .BYTE $19
- 1575 8A85 23 .BYTE $23
- 1576 8A86 24 .BYTE $24
- 1577 8A87 53 .BYTE $53
- 1578 8A88 1B .BYTE $1B
- 1579 8A89 23 .BYTE $23
- 1580 8A8A 24 .BYTE $24
- 1581 8A8B 53 .BYTE $53
- 1582 8A8C 19 .BYTE $19
- 1583 8A8D A1 .BYTE $A1
- 1584 8A8E 00 .BYTE $0 ;XXXYY100 INSTRS
- 1585 8A8F 1A .BYTE $1A
- 1586 8A90 5B .BYTE $5B
- 1587 8A91 5B .BYTE $5B
- 1588 8A92 A5 .BYTE $A5
- 1589 8A93 69 .BYTE $69
- 1590 8A94 24 .BYTE $24
- 1591 8A95 24 .BYTE $24
- 1592 8A96 AE .BYTE $AE ;1XXX1010 INSTRS.
- 1593 8A97 AE .BYTE $AE
- 1594 8A98 A8 .BYTE $A8
- 1595 8A99 AD .BYTE $AD
- 1596 8A9A 29 .BYTE $29
- 1597 8A9B 00 .BYTE $0
- 1598 8A9C 7C .BYTE $7C
- 1599 8A9D 00 .BYTE $0
- 1600 8A9E 15 .BYTE $15 ;XXXYYY10 INSTRS.
- 1601 8A9F 9C .BYTE $9C
- 1602 8AA0 6D .BYTE $6D
- 1603 8AA1 9C .BYTE $9C ;(WAS 0)
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 30-2
- ALBUG.M65 6502 DISASSEMBLER
-
- 1604 8AA2 A5 .BYTE $A5
- 1605 8AA3 69 .BYTE $69
- 1606 8AA4 29 .BYTE $29
- 1607 8AA5 53 .BYTE $53
- 1608 8AA6 84 .BYTE $84 ;XXXYYY01 INSTRS.
- 1609 8AA7 13 .BYTE $13
- 1610 8AA8 34 .BYTE $34
- 1611 8AA9 11 .BYTE $11
- 1612 8AAA A5 .BYTE $A5
- 1613 8AAB 69 .BYTE $69
- 1614 8AAC 23 .BYTE $23
- 1615 8AAD A0 .BYTE $A0
- 1616
- 1617 8AAE D8 MNEMR: .BYTE $D8 ;XXXXX000 INSTRS.
- 1618 8AAF 62 .BYTE $62
- 1619 8AB0 5A .BYTE $5A
- 1620 8AB1 48 .BYTE $48
- 1621 8AB2 26 .BYTE $26
- 1622 8AB3 62 .BYTE $62
- 1623 8AB4 94 .BYTE $94
- 1624 8AB5 88 .BYTE $88
- 1625 8AB6 54 .BYTE $54
- 1626 8AB7 44 .BYTE $44
- 1627 8AB8 C8 .BYTE $C8
- 1628 8AB9 54 .BYTE $54
- 1629 8ABA 68 .BYTE $68
- 1630 8ABB 44 .BYTE $44
- 1631 8ABC E8 .BYTE $E8
- 1632 8ABD 94 .BYTE $94
- 1633 8ABE 00 .BYTE $0
- 1634 8ABF B4 .BYTE $B4
- 1635 8AC0 08 .BYTE $8
- 1636 8AC1 84 .BYTE $84
- 1637 8AC2 74 .BYTE $74
- 1638 8AC3 B4 .BYTE $B4
- 1639 8AC4 28 .BYTE $28
- 1640 8AC5 6E .BYTE $6E
- 1641 8AC6 74 .BYTE $74
- 1642 8AC7 F4 .BYTE $F4
- 1643 8AC8 CC .BYTE $CC
- 1644 8AC9 4A .BYTE $4A
- 1645 8ACA 72 .BYTE $72
- 1646 8ACB F2 .BYTE $F2
- 1647 8ACC A4 .BYTE $A4
- 1648 8ACD 8A .BYTE $8A
- 1649 8ACE 00 .BYTE $0 ;XXXYY100 INSTRS.
- 1650 8ACF AA .BYTE $AA
- 1651 8AD0 A2 .BYTE $A2
- 1652 8AD1 A2 .BYTE $A2
- 1653 8AD2 74 .BYTE $74
- 1654 8AD3 74 .BYTE $74
- 1655 8AD4 74 .BYTE $74
- 1656 8AD5 72 .BYTE $72
- 1657 8AD6 44 .BYTE $44 ;1XXX1010 INSTRS.
- 1658 8AD7 68 .BYTE $68
- 1659 8AD8 B2 .BYTE $B2
- 1660 8AD9 32 .BYTE $32
- 1661 8ADA B2 .BYTE $B2
- 1662 8ADB 00 .BYTE $0
- 1663 8ADC 22 .BYTE $22
- 1664 8ADD 00 .BYTE $0
- 1665 8ADE 1A .BYTE $1A ;XXXYYY10 INSTRS.
- 1666 8ADF 1A .BYTE $1A
- 1667 8AE0 26 .BYTE $26
- 1668 8AE1 26 .BYTE $26 ;(WAS 0)
- 1669 8AE2 72 .BYTE $72
- 1670 8AE3 72 .BYTE $72
- 1671 8AE4 88 .BYTE $88
- 1672 8AE5 C8 .BYTE $C8
- 1673 8AE6 C4 .BYTE $C4
- 1674 8AE7 CA .BYTE $CA
- 1675 8AE8 26 .BYTE $26
- 1676 8AE9 48 .BYTE $48
- 1677 8AEA 44 .BYTE $44
- 1678 8AEB 44 .BYTE $44
- 1679 8AEC A2 .BYTE $A2
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 30-3
- ALBUG.M65 6502 DISASSEMBLER
-
- 1680 8AED C8 .BYTE $C8
- 1681
- LBUG - 6502 DEBUGGER (ATARI VERSION) CROSS 6(54) 17-OCT-83 15:59 Page 31
- ALBUG.M65 6502 DISASSEMBLER
-
- 1683 ;SPECIAL SYMBOL TABLE
- 1684
- 1685 8AEE 2F
-